fastify-multer,使用 Postman 进行测试,request.files 未定义
fastify-multer, testing with Postman, request.files is undefined
我正在尝试使用 fastify 创建一个消耗 multipart/form-data 的 api。我正在使用 fastify-multer
插件尝试发送文件,以便我可以将它们传递给另一个第 3 方 api。现在我只是想用 Postman 进行测试,但是当我用 png/pdf 文件发出 post 请求时,request.files
是未定义的。我尝试按照 fastify-multer
文档进行操作,但稍作修改。我将我的路线保存在一个单独的目录中,然后使用 fastify-autoload
将它们引入。server.js
正在注册我所有的插件,并且我有一个 index.js
启动服务器(和工作正常,所以我没有在下面包含它)。这是我的设置:
server.js
const path = require('path')
const fp = require('fastify-plugin')
const autoload = require('fastify-autoload')
const multer = require('fastify-multer')
const upload = multer({ storage: multer.memoryStorage() })
async function registerPlugins(server, config) {
server
.register(multer.contentParser)
.register(require('fastify-cors'), config.cors)
.register(require('fastify-helmet'))
.register(require('fastify-sensible'))
// auto-register all plugins
.register(autoload, {
dir: path.join(__dirname, 'plugins'),
ignorePattern: /.*test.js/,
options: config
})
// auto-register all routes
.register(autoload, {
dir: path.join(__dirname, 'routes'),
ignorePattern: /.*test.js/,
options: config
})
server.decorate('upload', upload)
}
module.exports = fp(registerPlugins)
my.routes.js
const fp = require('fastify-plugin')
const { createMerchantSchema } = require('./schema')
async function myRoutes(server, options) {
server.post(
'/merchant/:merchantId/uploadAttachment',
{ preHandler: server.upload.array('files', 8) },
async (request, reply) => {
console.log('FILES:')
console.log(request.files)
return reply.code(200).send('SUCCESS')
}
)
}
module.exports = fp(myRoutes)
我不会麻烦您显示我的目录结构,但我还有 6 个其他路由(此处未显示)工作正常,并且服务器启动时没有错误。这是我发送 POST /merchant/12345/uploadAttachment
:
时的控制台输出
[nodemon] starting `node index.js`
[1597110502609] INFO (96323 on 7L6BHR2.agrium.com): Server listening at http://0.0.0.0:3333
[1597110502609] INFO (96323 on 7L6BHR2.agrium.com): Server running at: http://0.0.0.0:3333
[1597110510972] INFO (96323 on 7L6BHR2.agrium.com): incoming request
reqId: 1
req: {
"method": "POST",
"url": "/merchant/123456/uploadAttachment",
"hostname": "localhost:3333",
"remoteAddress": "127.0.0.1",
"remotePort": 51207
}
FILES:
undefined
[1597110510981] INFO (96323 on 7L6BHR2.agrium.com): request completed
reqId: 1
res: {
"statusCode": 200
}
responseTime: 8.47090208530426
Postman 似乎只发送 header 数据;请求只有 408b:
我不会自己发送 Content-Type: multipart/form-data
header。 Postman 很聪明地添加了这一点,不提供它意味着我不必通过我自己的边界。
我真的不确定这里出了什么问题。有没有人这样设置fastify-multer
?有什么我想念的吗?我正在拔头发!任何建议将不胜感激。提前致谢!!!
感谢 fastify-multer
的创建者 Maksim Sinik 帮助我解决了这个愚蠢的问题。所有的功劳都归于他。我发现,事实上,fastify-multer
与 fastify-autoload
和 fastify-plugin
配合使用效果很好。我的问题是,在 Postman 中,我不允许 auto-generated header content-length
与请求一起发送:
在内部,fastify-multer
使用 npm 模块 type-is 来帮助发现请求的类型。如果content-length
不发送,content-type
不作为multipart/form-data
发送,type-is
hasBody
方法returnsnull,导致request.files
未定义。
故事的寓意:如果您想使用 Postman 测试 fastify-multer
(或任何其他多部分数据处理器),您必须确保 auto-generated content-length
和 content-type
header 已启用(选中):
我真的希望这对以后的人有所帮助。我正在拔头发!再次感谢马克西姆。您可以在 Github.
上找到他所做的更多工作
我正在尝试使用 fastify 创建一个消耗 multipart/form-data 的 api。我正在使用 fastify-multer
插件尝试发送文件,以便我可以将它们传递给另一个第 3 方 api。现在我只是想用 Postman 进行测试,但是当我用 png/pdf 文件发出 post 请求时,request.files
是未定义的。我尝试按照 fastify-multer
文档进行操作,但稍作修改。我将我的路线保存在一个单独的目录中,然后使用 fastify-autoload
将它们引入。server.js
正在注册我所有的插件,并且我有一个 index.js
启动服务器(和工作正常,所以我没有在下面包含它)。这是我的设置:
server.js
const path = require('path')
const fp = require('fastify-plugin')
const autoload = require('fastify-autoload')
const multer = require('fastify-multer')
const upload = multer({ storage: multer.memoryStorage() })
async function registerPlugins(server, config) {
server
.register(multer.contentParser)
.register(require('fastify-cors'), config.cors)
.register(require('fastify-helmet'))
.register(require('fastify-sensible'))
// auto-register all plugins
.register(autoload, {
dir: path.join(__dirname, 'plugins'),
ignorePattern: /.*test.js/,
options: config
})
// auto-register all routes
.register(autoload, {
dir: path.join(__dirname, 'routes'),
ignorePattern: /.*test.js/,
options: config
})
server.decorate('upload', upload)
}
module.exports = fp(registerPlugins)
my.routes.js
const fp = require('fastify-plugin')
const { createMerchantSchema } = require('./schema')
async function myRoutes(server, options) {
server.post(
'/merchant/:merchantId/uploadAttachment',
{ preHandler: server.upload.array('files', 8) },
async (request, reply) => {
console.log('FILES:')
console.log(request.files)
return reply.code(200).send('SUCCESS')
}
)
}
module.exports = fp(myRoutes)
我不会麻烦您显示我的目录结构,但我还有 6 个其他路由(此处未显示)工作正常,并且服务器启动时没有错误。这是我发送 POST /merchant/12345/uploadAttachment
:
[nodemon] starting `node index.js`
[1597110502609] INFO (96323 on 7L6BHR2.agrium.com): Server listening at http://0.0.0.0:3333
[1597110502609] INFO (96323 on 7L6BHR2.agrium.com): Server running at: http://0.0.0.0:3333
[1597110510972] INFO (96323 on 7L6BHR2.agrium.com): incoming request
reqId: 1
req: {
"method": "POST",
"url": "/merchant/123456/uploadAttachment",
"hostname": "localhost:3333",
"remoteAddress": "127.0.0.1",
"remotePort": 51207
}
FILES:
undefined
[1597110510981] INFO (96323 on 7L6BHR2.agrium.com): request completed
reqId: 1
res: {
"statusCode": 200
}
responseTime: 8.47090208530426
Postman 似乎只发送 header 数据;请求只有 408b:
我不会自己发送 Content-Type: multipart/form-data
header。 Postman 很聪明地添加了这一点,不提供它意味着我不必通过我自己的边界。
我真的不确定这里出了什么问题。有没有人这样设置fastify-multer
?有什么我想念的吗?我正在拔头发!任何建议将不胜感激。提前致谢!!!
感谢 fastify-multer
的创建者 Maksim Sinik 帮助我解决了这个愚蠢的问题。所有的功劳都归于他。我发现,事实上,fastify-multer
与 fastify-autoload
和 fastify-plugin
配合使用效果很好。我的问题是,在 Postman 中,我不允许 auto-generated header content-length
与请求一起发送:
在内部,fastify-multer
使用 npm 模块 type-is 来帮助发现请求的类型。如果content-length
不发送,content-type
不作为multipart/form-data
发送,type-is
hasBody
方法returnsnull,导致request.files
未定义。
故事的寓意:如果您想使用 Postman 测试 fastify-multer
(或任何其他多部分数据处理器),您必须确保 auto-generated content-length
和 content-type
header 已启用(选中):
我真的希望这对以后的人有所帮助。我正在拔头发!再次感谢马克西姆。您可以在 Github.
上找到他所做的更多工作