尝试让中间件在 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,我看不到如何?
[我想我可以重写以使用钩子,但我真的很感兴趣如何使用中间件来做到这一点]
谢谢
这个问题在 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和Restify在增强版中添加的方法 Fastify 中间件不支持 req 和 res。
和
Express修改节点核心Request和Response对象的原型 因此 Fastify 无法保证完全的中间件兼容性。
.params
和 .query
.query
来请求
以及 Express 运行查询中间件的位置
.use()
功能只是帮助用户从Express迁移到Fastify的实用程序。
输入函数接口是 (req, res, next)
但 req 和 res 对象是
标准 Node.js 对象 http.ClientRequest
和 http.ServerResponse (这是相同的
Express 中间件的接口)。
因此,假设用户已经使用标准 Node.js 对象为 Express 实现了中间件。
要归档您的需求,您应该按照
此处描述解析
req.url
。
Fastify v3 中将弃用 .use
API。
相反,如果您想开始使用 Fastify 进行开发,您应该迁移到
.register
。
寄存器是 Fastify 提供封装的一大特色
无需.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
}
})
Fastify 处理中间件的方式与 Express 不同,这意味着在将 Fastify 与 NestJS 结合使用时,
req.params
、req.query
和 req.body
在中间件中不会自动可用。发生这种情况是因为 Fastify 在中间件执行后处理路由参数。
考虑我在这里给出的答案 无法通过具有 FastifyAdapter 的应用程序的 NestJS 中间件获取请求正文
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();
});