【问题标题】:Express router.use not workingExpress router.use 不工作
【发布时间】:2025-12-16 02:15:02
【问题描述】:

我使用 express-generator 来生成一个 express 应用的基本结构。

我在 routes/my.js 中有这个:

 router.use('/update', function(req, res, next) {
    req.headers['content-type'] = 'application/json';
    console.log('router use invoked');
    next();
 });

router.get('/update', function(req, res, next) {
    console.log('=== GET /my/update', req.body);
});

router.post('/update', function(req, res, next) {
    console.log('=== POST /my/update', req.body);
});

我在 app.js 中添加了:

var my = require('./routes/my');

app.use('/', routes);
app.use('/users', users);
app.use('/my', my);

GET 工作正常,路由器中间件实际工作(调用了 console.log),但标头未设置为 app/json(因为 post 中的日志消息输出正文为空)。

我可以通过在任何其他中间件之前添加这个来解决这个问题

app.use('/my/update', function(req, res, next) {
  req.headers['content-type'] = 'application/json';
  next()
});

而且它有效。我尝试在任何其他中间件之前移动 app.use('my', my); 行,但它完全停止工作。

为了优先使用我的 router.use,我该怎么做?

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    您将标头添加到 request 对象,而不是响应。以下也是首选的方法。

    router.use('/update', function(req, res, next) {
        res.header('content-type', 'application/json');
        console.log('router use invoked');
        next();
    });
    

    【讨论】:

    • 我知道我正在设置请求标头,这就是我想要的。我想为请求设置一个默认的内容类型。
    • 不能设置请求头,只能get。如果要设置标头,则必须在响应对象上进行。请求传入,响应传出。
    • Afaik 我可以,在收到请求数据之前调用中间件。就像我说的,它适用于 app.use,只是不适用于 router.use。
    【解决方案2】:

    ExpressJS 是关于使用中间件的。

    根据官方文档here,中间件是一个可以访问请求对象(req)、响应对象(res)和下一个中间件的函数在 Express 应用程序的请求-响应周期中排成一行,通常由名为 next 的变量表示。

    中间件可以:

    • 执行任何代码
    • 更改请求和响应对象
    • 结束请求-响应周期
    • 调用堆栈中的下一个中间件

    我想指出一些关于你的 my.js 路由器的事情,如果你不想发回任何响应,那么它应该是这样的:

    router.get('/update', function(req, res, next) {
        res.end();
    });
    
    router.post('/update', function(req, res, next) {
        res.end();
    });
    

    您必须结束您的请求、响应周期,否则它将挂起。实际上,您希望将一些数据(最好是 JSON 数据)发送回客户端,以便您可以使用 res.json()res.send()。如果使用 res.json(),则无需设置 application/json 标头。

    【讨论】:

    • 这与我的问题无关。我已经有了 res.end(),为了简单起见,它被删除了。同样,我的问题是关于中间件的订单
    • 简而言之,如果您想发送 JSON,则不需要任何标头,只需使用 res.json() 即可完美运行。
    • @AlexFerg 然后,您需要在用于发送数据的任何内容上设置标题。在服务器端做是没有意义的。
    • 确实如此,这是某种类型的后备,以防发件人未指定。同样,您没有触及问题,您提供的方法和解决方案是针对不存在的问题。