Express.js在动态创建的路由中传递变量

时间:2016-09-14 20:20:16

标签: javascript express

我正在使用以下结构

在json文件中创建快捷js中的路由
{
  "/home":{
    "token":"ksdjfglkas"
  },
  "/logout":{
    "token":"ksdjfglksaudhf"
  }
}

我需要能够访问routes函数内的令牌。我用来生成路线的js是

for(var endpoint in context){
  var route = context[endpoint];
  app.use(endpoint,
    function(req,res,next){
      req.token= route.token;
      next();
    },
    require('./route-mixin'));
}

我面临的问题是route-mixin方法总是得到最后一个令牌。context在这种情况下只是我在上面添加的js文件。如何为每条路线单独传递不同的标记。

1 个答案:

答案 0 :(得分:1)

此问题的解决方案是将循环内容放入闭包中。

首先让我了解的问题是PhpStorm IDE: mutable variable is accessible from closure

第一个中间件中出现错误消息mutable variable is accessible from closure。这篇文章Mutable variable is accessible from closure. How can I fix this?给了我一个使用闭包的提示。

因此,让它运行所需的一切都在改变:

   for(var endpoint in context){
         var route = context[endpoint];
         app.use(endpoint,
             function (req, res, next) {
                 req.token = route.token;
                 next();
             },
             function (req, res) {
                 console.log(req.token);
                 res.send('test');
             }
         );
    }

为:

for(var endpoint in context){
    (function() {
        var route = context[endpoint];
        app.use(endpoint,
            function (req, res, next) {
                req.token = route.token;
                next();
            },
            function (req, res) {
                console.log(req.token);
                res.send('test');
            }
        );
    })();
}

我成功运行的完整示例代码:

var express = require('express');
var app = express();

var context =  {
    "/home":{
        "token":"ksdjfglkas"
    },
    "/logout":{
        "token":"ksdjfglksaudhf"
    }
};
for(var endpoint in context){
    (function() {
        var route = context[endpoint];
        app.use(endpoint,
            function (req, res, next) {
                req.token = route.token;
                next();
            },
            function (req, res) {
                console.log(req.token);
                res.send('test');
            }
        );
    })();
}

app.listen(3000);