我有一个简单的快递应用程序,它接收POST请求并执行对不同API的调用。我想在一个或多个API请求返回错误时发送电子邮件。我正在做的简化版如下: 文件app.js
var express = require('express');
var request = require('request');
var email=require('./elasticemail.js');
var numApiRequests=3;
var wasError=false;
var responseToClient;
app.post("/", function(req, res) {
responseToClient=res;
request({/*first request data*/},function (error, response, body){
if (error)
wasError=true;
done()
}
request({/*second request data*/},function (error, response, body){
if (error)
wasError=true;
done()
}
request({/*third request data*/},function (error, response, body){
if (error)
wasError=true;
done()
}
}//app.post
function done(){
isDone++;
if (isDone===numApiRequest){
if (wasError){
email.send('an error occurred')
responseToClient.send('there was an error')
}
else
responseToClient.send('everything was fine')
}
}//done
只要一次只有一个请求,这样就可以正常工作,但如果一次有多个请求,则变量" isError"," responseToClient"受每个请求执行的操作的影响。是否有任何方法可以通过done()函数访问这些变量但是其他请求不能访问这些变量? 我知道我可以在app.post()中声明这些变量并将它们作为参数传递给done(),这样它们就不需要具有全局范围,但我正在寻找一种通用方法来限制变量的范围到请求的上下文。
答案 0 :(得分:1)
您已明确将这些变量放在全局范围内。您希望确保变量的范围正确,因此它们仅适用于您正在处理的请求。
app.post("/", function(req, res) {
var wasError=false;
var responseToClient;
numApiRequests=3;
responseToClient=res;
...
您可以将done
函数添加到app post handler。
app.post("/", function(req, res) {
...
function done() {
...
}
});
答案 1 :(得分:0)
您可以将responseToClient
直接传递给done(),而不是使用全局(res
),以便在每个request()回调中都有done(res)
。然后只需适当修改done
函数。