multipart/form-data 在 Typescript Hapijs 中处理

multipart/form-data handling in Typescript Hapijs

我正在尝试制作一个 API 可以在打字稿中使用 HapiJS 接受和解析 CSV 文件。我在 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 使用它。我也找不到 class 有效载荷接口可以扩展。

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

一旦我取消注释允许 属性 并发出 POST 请求,POSTMAN 就会抛出 415 Unsupported Media Type 错误。尽管 POSTMAN 请求确实有一个有效的 multipart/form-data。 我如何检索此请求?

我认为负载配置不正确。 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

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

示例:

const { files } = request.paylad as YourInterface;