节点js表示,限制可变范围请求

我有一个简单的快速应用程序接收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 

只要一次只有一个请求就可以正常工作,但是如果一次有多个请求,则variables“wasError”,“responseToClient”会受到每个请求执行的操作的影响。 有什么办法可以通过done()函数访问这些variables,但不能被其他请求访问吗? 我知道我可以在app.post()中声明这样的variables,并将它们作为parameter passing给done(),以便它们不需要具有全局范围,但是我正在寻找一个通用方法来限制范围一个请求的上下文的variables。

你已经明确地把这些variables放在全局范围内。 你想确保variables的范围是正确的,所以他们只适用于你的工作要求。

 app.post("/", function(req, res) { var wasError=false; var responseToClient; numApiRequests=3; responseToClient=res; ... 

您可以将donefunction添加到应用程序后处理程序。

 app.post("/", function(req, res) { ... function done() { ... } }); 

您可以直接将res传递给done(),而不是使用全局( responseToClient ),以便在每个request()callback中done(res) 。 那么只要适当地修改done函数。