Javascript 为什么req.file是";“未定义”;当我尝试使用multer上传文件时,是否适用?

Javascript 为什么req.file是";“未定义”;当我尝试使用multer上传文件时,是否适用?,javascript,node.js,express,image-processing,multer,Javascript,Node.js,Express,Image Processing,Multer,我试图允许用户使用表单上传文件,然后应该在我的控制器文件中使用multer处理图像。出于某种原因,当我使用upload.single('foobar')时,它会返回为“未定义”,并破坏我的应用程序的其余部分。具体地说,当我运行代码时,createTour.js文件中的错误处理程序会返回一个警报,内容为“无法读取未定义的属性‘imageCover’”。任何帮助都将不胜感激。如果有用的话 以下是控制器文件代码(tourController.js): 这是前端的表单,用玉石书写(create.pug)

我试图允许用户使用表单上传文件,然后应该在我的控制器文件中使用multer处理图像。出于某种原因,当我使用upload.single('foobar')时,它会返回为“未定义”,并破坏我的应用程序的其余部分。具体地说,当我运行代码时,createTour.js文件中的错误处理程序会返回一个警报,内容为“无法读取未定义的属性‘imageCover’”。任何帮助都将不胜感激。如果有用的话

以下是控制器文件代码(tourController.js):

这是前端的表单,用玉石书写(create.pug):

这是处理表单数据并将其发布到API(createTour.JS)的客户端JS代码:

最后,不确定它是否有用,但这是路由器文件代码(tourRoutes.js):


由于您正在使用
multer.single()
上传的文件将作为对象填充在
req.file
下(请参阅)。但是,您在此行中以数组的形式访问它:

await sharp(req.file.imageCover[0].buffer)
将此更改为

await sharp(req.file.imageCover.buffer)
应该解决这个问题

此外,在客户端,您似乎没有实际执行
表单数据上传。您需要将其更改为以下内容:

const formData = new FormData();

formData.set('imageCover', imageCover);
// add some data from the input fields
formData.set('name', name); // add the other remaining
axios.post('http://127.0.0.1:8000/api/v1/tours', formData, {
    headers: {
        'content-type': 'multipart/form-data'
    }
})

由于您正在使用
multer.single()
上传的文件将作为对象填充在
req.file
下(请参阅)。但是,您在此行中以数组的形式访问它:

await sharp(req.file.imageCover[0].buffer)
将此更改为

await sharp(req.file.imageCover.buffer)
应该解决这个问题

此外,在客户端,您似乎没有实际执行
表单数据上传。您需要将其更改为以下内容:

const formData = new FormData();

formData.set('imageCover', imageCover);
// add some data from the input fields
formData.set('name', name); // add the other remaining
axios.post('http://127.0.0.1:8000/api/v1/tours', formData, {
    headers: {
        'content-type': 'multipart/form-data'
    }
})

嘿,谢谢!我做了此更改,但不幸的是,我得到了相同的结果。更新了我的答案-您还需要修改客户端代码并发送实际的
表单数据
请求。也许也可以看看,或者嘿,谢谢!我做了此更改,但不幸的是,我得到了相同的结果。更新了我的答案-您还需要修改客户端代码并发送实际的
表单数据
请求。也许你也会看到或者
const formData = new FormData();

formData.set('imageCover', imageCover);
// add some data from the input fields
formData.set('name', name); // add the other remaining
axios.post('http://127.0.0.1:8000/api/v1/tours', formData, {
    headers: {
        'content-type': 'multipart/form-data'
    }
})