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-multerfastify-autoloadfastify-plugin 配合使用效果很好。我的问题是,在 Postman 中,我不允许 auto-generated header content-length 与请求一起发送:

在内部,fastify-multer 使用 npm 模块 type-is 来帮助发现请求的类型。如果content-length不发送,content-type不作为multipart/form-data发送,type-ishasBody方法returnsnull,导致request.files 未定义。

故事的寓意:如果您想使用 Postman 测试 fastify-multer(或任何其他多部分数据处理器),您必须确保 auto-generated content-lengthcontent-type header 已启用(选中):

我真的希望这对以后的人有所帮助。我正在拔头发!再次感谢马克西姆。您可以在 Github.

上找到他所做的更多工作