【问题标题】:Express JS Router Middleware AbstractionExpress JS 路由器中间件抽象
【发布时间】:2017-03-08 18:41:47
【问题描述】:

我使用 Node.js + Express JS 开发了一个 API,并使用基于令牌的身份验证。

我在这个 api 中使用了两个不同的路由器,userRoute (/USER) 和 postRoute (/POST)。 postRoute 可以在身份验证中使用,但 userRoute 需要令牌。

为了解决我为 userRoute 使用路由器中间件但它干扰了 portRoute

这是代码:

...

var postRoute = express.Router();
var userRoute = express.Router();


// Route middleware to verify a token
userRoute.use(function(req, res, next) {
    security.checkToken(req,res, next);
});


userRoute.route('/users') 
    .get(userCtrl.findAllUsers)
    .post(userCtrl.addUser);


postRoute.route('/posts') 
    .get(userCtrl.findAllPosts)
    .post(userCtrl.addPost);


app.use(userRoute);
app.use(postRoute);

...

如果我尝试访问“/posts”,服务器会检查令牌并且不让我进入。我知道我是否更改了 app.use 的顺序,它可以工作,但我不明白为什么我会以这种方式工作使用“路由器中间件”。

有人知道吗?

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    发生这种情况是因为如果使用 express 路由器实现,如果您看一下它,您将能够很容易地理解它。这是路径:node_modules/express/lib/router/index.js。每次你调用 Router() 时,就像你的情况一样

    var postRoute = express.Router();
    var userRoute = express.Router();
    

    这个函数将被调用:

    var proto = module.exports = function(options) { ... }
    

    确实每次都返回不同的路由器实例。不同之处在于use 注册中间件的方式。如您所见,use 它是针对proto.use 注册的

    proto.use = function use(fn) { ... }
    

    这意味着您在那里注册的中间件将为您定义的每个路由器实例注册。

    【讨论】:

    • 感谢您的回答。但是理论上说,注册应用程序中间件“app.use(...)”时应该会发生这种情况,但使用路由器中间件“yourRoute.use(...)”时不会发生这种情况。如果不是,app中间件和路由器中间件有什么区别?
    • @WikiCode 如果您再次检查源代码node_modules/express/lib/express.js 第 42 行是这样的:mixin(app, proto, false); 据我了解,应用程序继承了路由定义的内容。如果你想专门为路由注册一个中间件,你可以这样做:app.use('/users', function(req, res, next) { security.checkToken(req,res, next); });你也可以看看这里:stackoverflow.com/questions/28305120/…
    • @WikiCode 也许我错了!我对 var 名称感到困惑。我一会儿回来。
    • @WikiCode 该应用继承自路由器。源码中也有注释:Proxy Router#use() to add middleware to the app router. See Router#use() documentation for details.
    • 谢谢,我明白了。我对 Express 中的路由器有不同的概念。
    猜你喜欢
    • 2023-03-25
    • 2023-03-09
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多