【问题标题】:Express route only works after the second try快速路线仅在第二次尝试后有效
【发布时间】:2019-07-28 09:40:35
【问题描述】:

我正在为 node.js 后端服务器使用 express 框架。我正在使用快速路由器来定义不同的路由。

这是我的app.js 文件:

var express = require('express');
var app = express();
var server = require('http').Server(app);

var cors = require('cors');
app.use(cors());

app.use(express.json());

var route = require('./route');
app.use('/api/', route);

server.listen(3000, () => {
    console.log('App running on port 3000!');
});

这是我的路由器route.js:

var express = require('express');
var router = express.Router();

var controller = require('./controller');

router.use(function (req, res, next) {

    next();

    router.get('/test', function (req, res, next) {
        controller.get(req, res, next);
    });

});

module.exports = router;

路由本身使用控制器进行逻辑controller.js

exports.get = function (req, res, next) {
  res.send('Hello World');
}

使用node app.js 启动应用程序并调用定义的路由http://localhost:3000/api/test 将导致Cannot GET /api/test 第一次尝试。但是,第二次调用该路由会得到预期的答案hello world

第一次调用失败的原因是什么?为什么它在第二次尝试时起作用?任何想法表示赞赏

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    因为router.use(function (req, res, next) { 只会在第一个请求时执行,而当您调用next() 时,该路由尚未添加。之后你调用router.get(...),它会添加路由,以便下次可用。

    尽管如此,这很糟糕,将 .get(...) 移到 .use(...) 之外(您也可以完全摆脱它)。

    【讨论】:

    • 谢谢,这很有意义并且有效。但是我将如何实现验证。上面的代码是实际代码的精简版,在我的代码中,next() 仅在与请求对应的存储会话正确时才被调用。
    • "将 .get(...) 移出 .use(...)"
    • 只是为了澄清,你没有做对 - 这就是乔纳斯的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多