Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express.js中间件中传递的参数是否缓存?_Node.js_Express_Closures_Middleware - Fatal编程技术网

Node.js Express.js中间件中传递的参数是否缓存?

Node.js Express.js中间件中传递的参数是否缓存?,node.js,express,closures,middleware,Node.js,Express,Closures,Middleware,我一直在使用express.js构建我的第一个node.js应用程序。 这很有趣:) 我一定是有点误解了,所以就这样吧 我有一些路线定义如下: app.all('/account/summary', apiPOST('AccountSummary', {FromDate: 'default', ToDate: 'default'}), function(req, res){ var data=req.apiJSON; console.log(data); res.render('a

我一直在使用express.js构建我的第一个node.js应用程序。 这很有趣:) 我一定是有点误解了,所以就这样吧

我有一些路线定义如下:

app.all('/account/summary', apiPOST('AccountSummary', {FromDate: 'default', ToDate: 'default'}), function(req, res){

  var data=req.apiJSON;
  console.log(data);
  res.render('accountsummary', {locals: data, layout: 'layouts/layout'});

});
apiPOST = function (operation, postParams) {

  return function (req, res, next){

    console.log('RIGHT AT START');
    console.log(postParams);
    console.log('END');

    var currentDate = new Date();
    var day = ('0'+currentDate.getDate()).slice(-2);
    var month = ('0'+(currentDate.getMonth() + 1)).slice(-2);
    var year = ('0'+currentDate.getFullYear()).slice(-4);
    console.log('BEFORE DATES');
    console.log(postParams);
    if (typeof(postParams.FromDate)!='undefined' && (postParams.FromDate=='default' || postParams.FromDate=='')){
      postParams.FromDate=year+'-'+month+'-'+day;
    }

    if (typeof(postParams.ToDate)!='undefined' && (postParams.ToDate=='default' || postParams.ToDate=='')){
      postParams.ToDate=year+'-'+month+'-'+day;
    }

    //automatically add all posted data to postParams
    if (typeof(req.body)!='undefined'){
      for (var key in req.body){
        if (req.body.hasOwnProperty(key)){
          postParams[key]=req.body[key];
        }
      }
    }

    // here is do some talking to an XML web service and convert it to JSON;
    // we use our postParams variable to POST
    next();

  }
}
apiPOST()的定义如下:

app.all('/account/summary', apiPOST('AccountSummary', {FromDate: 'default', ToDate: 'default'}), function(req, res){

  var data=req.apiJSON;
  console.log(data);
  res.render('accountsummary', {locals: data, layout: 'layouts/layout'});

});
apiPOST = function (operation, postParams) {

  return function (req, res, next){

    console.log('RIGHT AT START');
    console.log(postParams);
    console.log('END');

    var currentDate = new Date();
    var day = ('0'+currentDate.getDate()).slice(-2);
    var month = ('0'+(currentDate.getMonth() + 1)).slice(-2);
    var year = ('0'+currentDate.getFullYear()).slice(-4);
    console.log('BEFORE DATES');
    console.log(postParams);
    if (typeof(postParams.FromDate)!='undefined' && (postParams.FromDate=='default' || postParams.FromDate=='')){
      postParams.FromDate=year+'-'+month+'-'+day;
    }

    if (typeof(postParams.ToDate)!='undefined' && (postParams.ToDate=='default' || postParams.ToDate=='')){
      postParams.ToDate=year+'-'+month+'-'+day;
    }

    //automatically add all posted data to postParams
    if (typeof(req.body)!='undefined'){
      for (var key in req.body){
        if (req.body.hasOwnProperty(key)){
          postParams[key]=req.body[key];
        }
      }
    }

    // here is do some talking to an XML web service and convert it to JSON;
    // we use our postParams variable to POST
    next();

  }
}
首先,这个很好用。当通过GET请求到达页面时,它的默认值为FromDate和ToDate到today。此页面有一个表单,您可以发布该表单以指定新的FromData和ToDate。发布的数据会自动添加到后参数中,这也可以正常工作

我遇到的问题是,下次用户使用GET访问页面时,以前发布的数据仍然存在,因此默认为该数据,而不是今天

我不明白为什么这些数据仍然可用。从外观上看,它并没有被发布,而是在postParams中被记住。postParams现在是全球性的吗


谢谢

发生的事情是,在
应用程序期间,您只调用了一次
apiPOST
。所有的
调用都配置了该路由,并且一个调用创建了一个
postParams
参数对象,以后所有调用
apiPOST
返回的函数都将共享该对象。

是的,这是有意义的。我必须意识到,路由是在程序启动时添加的,而不是像其他apachemvc实现那样基于HTTP请求添加的。
postParams
对于该路由或调用
apiPost
的所有路由都是唯一的吗?每次调用
apiPost
都会得到自己的
postParams
参数,因此它对于每个路由和您使用它的方式都是唯一的。感谢您迄今为止的所有帮助!只是想知道我脑子里的想法是否正确。我返回一个函数的事实是,是什么让它在路由中保持唯一性?这是闭包的典型示例吗?是的,您返回的函数捕获它引用的任何上下文,以便在运行时可用。这是一个闭包的例子。