Node.js NodeJs:对请求url使用异步-Post方法在执行所有url之前发送响应
我有一个post方法,它的请求输入是一个newLink对象列表(带有linkUrl和status属性的newLink) 我使用async.map在我的URL上进行迭代,以检查链接是否处于活动状态 newLinks包含类似于{www.google.com、www.nourl.com、www.xyz.com}的链接。我希望在处理完所有请求并将相应状态设置为true或false后,使用res.send发送此链接(newLinks) 但控制台会给出以下结果:“www.google.com已启动”,然后调用res.send(),然后执行“www.nourl.com已启动”和“www.xyz.com已启动” 基本上在这里,在第一个url请求之后,我下面的代码在异步循环之外执行函数。我认为async只允许在验证所有URL之后执行下一段代码Node.js NodeJs:对请求url使用异步-Post方法在执行所有url之前发送响应,node.js,async.js,Node.js,Async.js,我有一个post方法,它的请求输入是一个newLink对象列表(带有linkUrl和status属性的newLink) 我使用async.map在我的URL上进行迭代,以检查链接是否处于活动状态 newLinks包含类似于{www.google.com、www.nourl.com、www.xyz.com}的链接。我希望在处理完所有请求并将相应状态设置为true或false后,使用res.send发送此链接(newLinks) 但控制台会给出以下结果:“www.google.com已启动”,然后调
app.post('/myposturl', function(req , res){
var request = require('request');
let linkDetails= req.body.linkDetails;
var i = 0;
async.map(linkDetails, function(newLink, callback) {
var Url = "url";
var url = newLink.linkUrl;
var proxiedRequest = request.defaults({'proxy': Url});
proxiedRequest(url , function (error, response, body) {
if(error){
console.log('Err: '+ error);
}
if (!error) {
if(response.statusCode == 200 || response.statusCode == 201 ||
response.statusCode == 202){
console.log(url + ' is up!!');
newLink.isActive = true;
}
if(response.statusCode == 301 || response.statusCode == 302){
console.log(url + ' is redirecting us!!');
return false;
}
}
});
callback();
} , function(err, linkDetails) {
res.send(linkDetails);
});
//tried res.send here as well.
});
}
async.map的回调
应该在proxiedRequest
内部调用。代码现在正在执行的操作:在proxiedRequest
完成之前立即调用callback
。也返回false代码>在异步函数中不起作用。您应该像下面这样返回新状态回调(null,newLink)
。处理完所有请求后,newLinkDetails
将成为所有newLink
的数组
注意,由于此函数并行地将iteratee应用于每个项,因此不能保证iteratee函数将按顺序完成
如果您需要维持订单,请用户安装
更多信息请阅读。希望能有帮助
app.post('/myposturl', function(req , res){
//other codes
async.map(linkDetails, function(newLink, callback) {
//other codes
proxiedRequest(url , function (error, response, body) {
if(error){
console.log('Err: '+ error);
callback(error);
//^ ^ ^ ^ ^
// Validation failed, return from here
}
else {
//some validation & set newLink.isActive
callback(null, newLink);
// ^ ^ ^ ^ ^
//return newLink status by invoking the callback
}
});
}, function(err, newLinkDetails) {
//err = if any Validation failed
// now all the request are processed,newLinkDetails is array of all newLink's
res.send(newLinkDetails);
});
});
通常在使用async.js
时,我遵循以下两个原则:
- 在异步函数期间,始终至少且最多调用一次
回调
- 仅当异步函数完成或出现错误时,才调用
回调函数。如果出现后者,调用回调
传递错误
,并停止进一步执行异步函数,例如返回回调(错误)
我将修改您的代码如下:
var request = require('request');
app.post('/myposturl', function (req , res) {
async.mapSeries(req.body.linkDetails || [], function(newLink, callback) {
var Url = "url";
var proxiedRequest = request.defaults({ 'proxy': Url });
proxiedRequest(newLink.linkUrl, function (err, response, body) {
if (err)
return callback(err);
// I'm assuming you don't want to stop checking the links for bad status codes
if ([301, 302].indexOf(response.statusCode) > -1){
return callback(null, url + ' is redirecting us!!');
if ([200, 201, 202].indexOf(response.statusCode) == -1) {
return callback(null, url + ' came back with ' + response.statusCode);
console.log(url + ' is up!!');
newLink.isActive = true;
callback(null, newLink);
});
}, function (err, linkDetails) {
// when all links get checked, it will come down here
// or if an error occurs during the iteration, it will come down here
console.log(err, linkdetails);
res.send(linkDetails);
});
});
如果您只想恢复活动链接,您可能还想签出。此处,回调
需要在其第二个参数中传递一个布尔值。尝试使用async.mapSeries。尝试过,但没有成功:(代替async.map,尝试async.series并在async.series中使用forin循环。我在我的一个应用程序中尝试了它,效果很好。我也尝试了这些,但问题是我只有在res.send之后才能得到响应,基本上它不会等待响应到达。