Bash 如何在Hapi.js中处理多次上传

Bash 如何在Hapi.js中处理多次上传,bash,curl,file-upload,hapi.js,Bash,Curl,File Upload,Hapi.js,当提交多个上传时,以下index.js可以正常工作 与: 但如果只提交一个文件,则会失败: curl http://localhost:4000/upload -F 'files=@data/file1.txt' 因为hapi希望文件是数组 也就是说,如果我使用files[]来代替,它也不起作用 curl http://localhost:4000/upload -F 'files[]=@data/file1.txt' 我可以通过在index.js中检查文件是否是数组来解决这个问题,如果不是

当提交多个上传时,以下index.js可以正常工作 与:

但如果只提交一个文件,则会失败:

curl http://localhost:4000/upload -F 'files=@data/file1.txt'
因为hapi希望文件是数组

也就是说,如果我使用files[]来代替,它也不起作用

curl http://localhost:4000/upload -F 'files[]=@data/file1.txt'
我可以通过在index.js中检查文件是否是数组来解决这个问题,如果不是,我就用[files]来包装它,这样剩余的代码就不会中断,但我觉得解决方案没有那么优雅。这是hapi.js文件上传处理中的限制/错误吗

/* index.js */
const Hapi = require('hapi')
const server = new Hapi.Server()
server.connection({
    port:4000
})

const routes = [
    {
        path: '/upload',
        method: 'POST',
        config: {
            payload: {
                output: 'stream',
                parse: true,
                allow: 'multipart/form-data'
            }
        },
        handler: function(request, reply) {
            const p = request.payload, files = p.files
            if(files) {
                console.log(`${files.length} files`)
                files.forEach(function(file) {
                    // do something with file here
                })
            }
            return reply({result: 'ok'})
        }
    }
]

server.route(routes)

server.start(function() {
    console.log(`server started at ${server.info.uri}`)
})

事实上,Hapi无法判断files元素是否是数组,除非它可以从一个请求中的多次使用中推断出来

您应该能够通过添加有效负载验证来告诉Hapi如何显式解释它。比如:

config: {
    payload: {
        output: 'stream',
        parse: true,
        allow: 'multipart/form-data'
    },
    validate: {
        payload: Joi.object({
            files: Joi.array().single()
        })
    }
},

我刚刚发现,通过使用以下技术,确保文件始终是一个数组实际上非常容易:

const p = request.payload, files = [].concat(p.files)

不知道单一的、伟大的用例。我已经试过你的建议了,它很有魅力。谢谢
const p = request.payload, files = [].concat(p.files)