【问题标题】:Express middleware, changes to request object do not persistExpress 中间件,对请求对象的更改不会持续存在
【发布时间】:2019-10-22 22:17:02
【问题描述】:

我正在尝试在 Express 中实现一些应该为所有路由调用的中间件。这个中间件应该改变请求对象。

我已经尝试了几件事,但似乎一直遇到同样的问题。中间件一离开,请求对象就好像变回了原来的状态。

目前我的代码类似于(我用一个极简示例对其进行了简化):

route.js:

const express = require('express');
const router = express.Router();
router.get('/getMe', (req, res) => {
  // return the desired data.
  // I expect req.params.myString to exist here but it does not.
});
module.exports = router;

index.js:

const express = require('express');
const router = express.Router();
router.use('/', require('./route'));
module.exports = router;

app.js:

const express = require('express');
const app = express();
const routes = require('./index');

app.use((req, res, next) => {
  // Adding req.params.myString to the request object.
  if (req.params.myString === undefined) req.params.myString = 'hello world';
  next();
});

app.use('/api', routes);

如您所见,我省略了一些代码以使其更具可读性。这是获取响应并设置服务器的代码。

再次,我期待 req.params.myString 在端点中可用。有人看到我做错了吗?

【问题讨论】:

    标签: express express-router


    【解决方案1】:

    在快递文档 (http://expressjs.com/en/api.html#req.params) 中说:

    如果您需要更改 req.params 中的键,请使用 app.param 处理程序。更改仅适用于已定义的参数 路由路径。

    所以你需要检查 app.param 处理程序。

    http://expressjs.com/en/4x/api.html#app.param

    【讨论】:

    • 能否请您提供一个工作示例。出于某种原因,我仍然无法让它工作。我发现另一个问题说你不能对 req 对象应用任何东西,但你可以 res.所以现在我正在尝试这样做,但即使我使用声明它的路由,req.params.myString 似乎也不存在。
    • 嗨,我实际上没有尝试过,但正如文档中所述,如果要求没问题,似乎是可能的。你看过这里的例子吗expressjs.com/en/4x/api.html#app.param
    【解决方案2】:

    您应该在 app.js 中使用 app.set("myString", "hello World"),然后您可以使用 req.app.get("myString") 访问您的 route.js/index.js 脚本中的字段。或者这也应该起作用,将其设置为app.myString = "Hello world" 并像req.app.myString 一样访问它。

    【讨论】:

    • 我相信对于嵌套在请求中的 params 对象,这在应用程序级别不起作用,因为据我所知,它在通过低谷时被重置。我稍后会尝试,但我还通过将中间件直接应用于每条路由找到了另一个解决方案。在那里可以访问 req.params 对象。
    猜你喜欢
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2014-08-28
    • 2014-05-27
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多