4

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

Fastify 支持开箱即用的 Express/Restify/Connect 中间件,这意味着你可以直接插入旧代码,它就可以工作!(顺便说一句,更快)

但举个简单的例子:

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,我看不出怎么办?

[我想我可以重写以使用钩子,但我真的很感兴趣我打算如何使用中间件来做到这一点]

谢谢

4

4 回答 4

6

当 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处理 不提供or字段的Node.js HTTP 类。.params.query

Express 将这些字段添加为对开发人员的好处。如果您使用的中间件依赖于这些功能,不幸的是,它不会直接加入。

一切都没有丢失

如果你选择将中间件迁移到 Fastify,Request 对象上可以使用.params.query 字段。

在你的问题中使用中间件,这就是 Fastify 版本的样子。

fastify.addHook('onRequest', function(request, reply, done) {
  console.log('query', request.query);
  console.log('params', request.params);

  done();
})

Fastify 要求开发人员更多地考虑 Hooks,而不是中间件。这提供了更大的灵活性和更快的速度,但有时编写起来会更复杂一些。

补充阅读

Fastify 网站上的LifecycleHooks文档提供了有关这些部分如何协同工作的更多详细信息。

中间件文档 提供了有关支持哪些功能的更多详细信息。

有点相关,使用插件 ,您可以将范围限定到特定路径。

参考

Express 中间件支持

中间件文档

此外,Fastify 中间件不支持 Express 和 Restify 添加到 req 和 res 增强版本的方法。

Express 大量修改了节点核心 Request 和 Response 对象的原型,因此 Fastify 无法保证完全的中间件兼容性。

快速添加.params.query

Express 添加.query到请求 以及Express 运行查询中间件的位置

快速向路由添加参数

于 2019-11-18T23:05:29.710 回答
1

.use()功能只是帮助用户从 Express 迁移到 Fastify 的实用程序。输入函数接口是(req, res, next),但req和res对象是标准的Node.js对象http.ClientRequesthttp.ServerResponse(与Express中间件的接口相同)。因此假设用户已经使用标准 Node.js 的对象为 Express 实现了中间件。

req.url要归档您的需求,您应该按照此处所述进行解析。该.useAPI 将在 Fastify v3 中弃用。

相反,如果你想开始使用 Fastify 进行开发,你应该迁移到.register. 寄存器是 Fastify 的一大特色,提供封装

于 2019-08-27T14:55:25.230 回答
0

你可以在没有 .use 方法的情况下使用 fastify,只需使用 fastify.route。

 fastify.route({
  method: 'GET',
  url: '/',
  schema: {
    // request needs to have a querystring with a `name` parameter
    querystring: {
      name: { type: 'string' }
    }
  },
  handler: async (request, reply) => {
 // here you will get request.query if your schema validate
  }
})
于 2019-10-17T07:20:10.053 回答
0

我 Fastify 使用方法用于注册中间件。中间件是具有以下签名的函数 middleware(err, req, res, next) 试试:

fastify.use(function(err, req, res, next) {
    console.log('req.query', req.query);   // undefined
    console.log('req.params', req.params);
    next();
});
于 2019-08-25T12:32:27.423 回答