NodeJS 6.9.3
我编写了一个简单的 NodeJS 应用程序,它发出如下所示的请求:
var http_request = require('request')
http_request(
{ method: 'GET'
, uri: 'https://search-xxxxxx.us-east-1.es.amazonaws.com/facts/_search?pretty=true'
, 'content-type': 'application/json'
, body: es_regexp_query_as_string
}
, function (error, response, body) {
if(
response.statusCode == 201
||
response.statusCode == 200) {
而且效果很好。我在回调中做了我需要做的任何事情。但是,现在我需要重新构建这个应用程序,以便它可以执行任意数量的请求,而不是执行一个 HTTP 请求。据我了解,在 NodeJS 中处理此问题的理想“设计模式”是将每个请求包装在 Promise 中,然后将所有 Promise 交给以下调用:
Promise.all(something)
但我一直在阅读这篇文章,但我不知道如何将 HTTP 请求转换为 Promises。或者更确切地说,存在大量相互矛盾的建议。显然,就在过去一两年,NodeJS 中“Promise”的概念发生了很大变化。
我尝试简单地将整个代码块包装在 Promise 中,但这不起作用。那我该怎么办?
如果您想要一个没有任何外部模块的解决方案,请检查以下代码:
// Dependencies
var http = require('http');
var https = require('https');
var httpRequest = function(options){
if(!options) return new Promise((_, reject)=>{ reject( new Error('Missing \'options\' arg.'))})
if(!options.host) return new Promise((_, reject)=>{ reject( new Error('\'host\' parameter is empty.'))})
var protocol = (options.protocol || 'http').toLowerCase();
var method = (options.method || 'GET').toUpperCase();
var path = options.path || '/';
var port = options.port || (protocol == 'https' ? 443 : 80);
var _http = protocol == 'https'? https : http;
var prom = new Promise((resolve, reject)=>{
var ops = {
host : options.host, // here only the domain name
port : port,
path : (/^(\/)/i.test(path) ? '' : '/' ) + path,
headers: options.headers || {},
method : method
};
var body = options.body;
if(body && typeof(body) === 'object'){
body = JSON.stringify(body);
if(!utils.hasHeader(ops, 'Content-Type')) ops.headers['Content-Type'] = 'application/json; charset=utf-8';
if(!utils.hasHeader(ops, 'Content-Length')) ops.headers['Content-Length'] = Buffer.byteLength(body, 'utf8');
}
var req = _http.request(ops, (res)=>{
var decoder = new StringDecoder('utf-8');
var buffer = '';
res.on('data', function(data) {
buffer += decoder.write(data);
});
res.on('end', function() {
buffer += decoder.end();
if(/^(2)/i.test(res.statusCode.toString()))
resolve({statusCode : res.statusCode , data : buffer })
else
reject({statusCode : res.statusCode , error : buffer })
});
req.on('error', (err)=>{
reject({statusCode : 0, error : err});
})
req.on('timeout', (err)=>{
reject({statusCode : 0, error : new Error('Timeout exeded.')});
})
if(body) req.write(Buffer.from(body).toString('utf8'));
req.end();
});
return prom;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)