【问题标题】:multipart/form-data handling in Typescript HapijsTypescript Hapijs 中的多部分/表单数据处理
【发布时间】:2020-11-17 06:54:03
【问题描述】:

我正在尝试使用打字稿中的 HapiJS 制作一个可以接受和解析 CSV 文件的 API。我在 nodeJS 中测试了以下 API,结果非常好。

    server.route({
    path: '/file',
    method: 'POST',
    config: {
        handler: (req, h) => {
            let results = []
            let count = 0
            const payload = req.payload
            const data = payload.files
            data.pipe(csv({ headers: false }))
                .on('data', (data) => results.push(data))
                .on('end', () => {
                    results.forEach(result => {
                        console.log(result['0'])
                    })
                });
            return "file read"
        },
        payload: {
            output: 'stream',
            parse: true,
            allow: 'multipart/form-data'
        }
    }
})

我尝试在 Typescript 中复制它,并且已经使用了很长时间。我有以下问题:

  1. 如何将有效负载对象转换为可用的类型?我有我的有效载荷对象抛出:
     Element implicitly has an 'any' type because expression of type '"files"' can't be used to index type 'string | object | Buffer | Readable'.
      Property 'files' does not exist on type 'string | object | Buffer | Readable'.
    
    37                 const data = payload['files'] 

我创建了一个接口,但不知道如何强制 Payload 使用它。我也找不到负载接口可以扩展的类。

  1. 这是最大的问题。 payload 选项的 allow 属性对我不起作用。
              payload: {
                  output: 'stream',
                  parse: true,
                  //allow: 'multipart/form-data',
              },

只要我取消注释允许属性并发出 POST 请求,POSTMAN 就会抛出 415 Unsupported Media Type 错误。即使 POSTMAN 请求确实具有有效的多部分/表单数据。 如何检索此请求?

【问题讨论】:

  • 你的界面是什么样的?
  • @Christian 目前,我还没有实现任何东西,因为我不确定要扩展什么来让 Payload 拥有文件属性。对多部分问题有什么想法吗?
  • 不应该是file而不是payload上的files吗?
  • 应该是这样。但显然,文件工作并且文件抛出了错误。也许我做错了什么。

标签: node.js typescript httprequest multipartform-data hapijs


【解决方案1】:

我认为有效负载配置不正确。 Version 19.0.0 引入了关于多部分配置的重大更改。

从此版本开始,负载配置的multipart 属性默认为false,这意味着您必须将其指定为false 以外的其他内容,以使其接受多部分负载。

根据docs,它应该设置为true 或使用包含output 属性规范的对象。

所以试试这个:

payload: {
    parse: true,
    allow: 'multipart/form-data',
    multipart: { output: 'stream' },
}

至于编译错误,可以使用any类型进行转换:

const payload: any = req.payload
const data = payload.files

【讨论】:

【解决方案2】:

对于第二点,您可以尝试强制执行有效负载的类型。

例子:

const { files } = request.paylad as YourInterface;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2013-04-27
    • 2010-11-03
    • 2021-04-06
    • 2011-07-30
    相关资源
    最近更新 更多