试图让中间件在Fastify中工作-我似乎无法访问查询或参数。文档说:



但举一个简单的例子:

fastify.use(function(req, res, next) {
  console.log('req.query', req.query);   // undefined
  console.log('req.params', req.params); // undefined
  next();
});

同样,如果我添加/限制网址:
fastify.use('/foo', function(req, res, next) {

我确定我遗漏了一些东西,但是文档确实声称它“有效”-我看不到您是否无法访问qs?

[我认为我可以重写以使用钩子(Hook),但是我真的对使用中间件实现这一目标很感兴趣]

谢谢

最佳答案

当Fastify 2是主要版本时,此问题得到了回答。对于Fastify 3,此答案可能不正确

虽然Fastify与Express/Restify方法签名兼容,但是传递的值并不完全相同。方法签名为:

/**
 * Generic middleware method
 * @param {http.IncomingMessage} req
 * @param {http.ServerResponse} res
*/
const middleware = (req, res) => {
}

fastify.use(middleware)
使用.use时,Fastify仅处理Node.js HTTP classes
不提供.params.query字段。
Express将这些字段添加为对开发人员的好处。如果您使用的是中间件
依靠这些功能,不幸的是,它不会直接插入。
一切都不会丢失
如果您选择将中间件迁移到Fastify,则.params.query字段在Request上可用
目的。
使用您问题中的中间件,这就是Fastify版本将要使用的中间件
看起来像。
fastify.addHook('onRequest', function(request, reply, done) {
  console.log('query', request.query);
  console.log('params', request.params);

  done();
})
Fastify要求开发人员在 Hook 方面更多地思考,而在中间件方面则少一些。这样可以提供更大的灵活性和更快的速度,但有时编写起来会有些复杂。
补充阅读
Lifecycle
Fastify上的Hooks文档
该站点提供了有关这些部分如何协同工作的更多详细信息。
Middleware documentation
提供有关支持哪些功能的更多详细信息。
使用Plugins有点相关
您可以将范围限定为特定路径。
引用
快速中间件支持
the Middleware documentation:



快速添加.params.query Express adding .query to request
哪里Express runs the query middleware
Express adding parameters to route

10-06 10:33