【问题标题】:fastify-multer, testing with Postman, request.files is undefinedfastify-multer,用 Postman 测试,request.files 未定义
【发布时间】:2020-11-30 16:01:10
【问题描述】:

我正在尝试使用 fastify 创建一个使用 multipart/form-data 的 api。我正在使用fastify-multer 插件来尝试发送文件,以便我可以将它们传递给另一个 3rd 方 api。现在我只是尝试使用 Postman 进行测试,但是当我使用 png/pdf 文件发出发布请求时,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

邮递员似乎只发送标题数据;请求只有 408b:

我不会自己发送Content-Type: multipart/form-data 标头。邮递员很聪明,可以添加它,不提供它意味着我不必越过自己的边界。

我真的不确定这里出了什么问题。有没有人这样设置fastify-multer?有什么我想念的吗?我要拔头发了!任何建议将不胜感激。提前谢谢!!!

【问题讨论】:

  • 你检查server.upload.array('files', 8)是否返回一个函数?
  • 是的,它显示为[Function: multerPreHandler]

标签: javascript node.js postman multer fastify


【解决方案1】:

感谢fastify-multer 的创建者 Maksim Sinik 帮助我解决了这个愚蠢的问题。所有的功劳都归于他。我发现,事实上,fastify-multerfastify-autoloadfastify-plugin 配合得很好。我的问题是,在 Postman 中,我不允许将自动生成的标头 content-length 与请求一起发送:

在内部,fastify-multer 使用 npm 模块 type-is 来帮助发现请求的类型。如果未发送content-length,则content-type 不会作为multipart/form-data 发送,并且type-is hasBody 方法返回null,这将导致request.files 未定义。

故事的寓意:如果您想使用 Postman 测试 fastify-multer(或任何其他多部分数据处理器),您必须确保启用自动生成的 content-length AND content-type 标头(选中) :

我真的希望这对将来的某人有所帮助。我正在拔头发!再次感谢马克西姆。你可以在Github找到更多他所做的工作。

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 2018-08-06
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多