Fastify 中间件 - 访问查询和参数?

问题描述 投票:0回答:5

尝试让中间件在 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,我看不到如何?

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

谢谢

javascript node.js middleware fastify
5个回答
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 only 处理 Node.js HTTP 类 不提供
.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 要求开发人员更多地考虑 Hooks,而不是中间件。这提供了更大的灵活性和更快的速度,但有时编写起来可能有点复杂。

补充阅读

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

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

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

参考文献

Express 中间件支持

来自 中间件文档

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

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

快速添加
.params
.query

快递添加

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

快速向路由添加参数


1
投票

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

要归档您的需求,您应该按照

此处描述
解析req.url。 Fastify v3 中将弃用
.use
API。

相反,如果您想开始使用 Fastify 进行开发,您应该迁移到

.register
。 寄存器是 Fastify 提供封装的一大特色


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
  }
})

0
投票

了解 Fastify 中间件设计:在 NestJS 中访问路由参数和请求数据

Fastify 处理中间件的方式与 Express 不同,这意味着在将 Fastify 与 NestJS 结合使用时,

req.params
req.query
req.body
在中间件中不会自动可用。发生这种情况是因为 Fastify 在中间件执行后处理路由参数。

考虑我在这里给出的答案 无法通过具有 FastifyAdapter 的应用程序的 NestJS 中间件获取请求正文


-1
投票

I Fastify 使用方法用于注册中间件。中间件是一个具有以下签名的函数中间件(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();
});
© www.soinside.com 2019 - 2024. All rights reserved.