node js express,限制变量范围以请求

时间:2014-04-10 16:28:56

标签: node.js express

我有一个简单的快递应用程序,它接收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(),这样它们就不需要具有全局范围,但我正在寻找一种通用方法来限制变量的范围到请求的上下文。

2 个答案:

答案 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函数。