对于相同的问题,我已经找到了很多答案,但是我还没有找到可行的解决方案。我正在尝试制作一个可以使用express和multer上传文件的Web应用程序,但是我遇到的问题是没有文件上传,并且“ path”始终未定义。
destination : (req, file, cb) => cb(null,'public/images'),
filename : (req, file, cb) => cb(null, file.originalname)
})
app.use(multer({ storage : imageStorage}).single('imageFile'));
let id = 1;
app.get('/posts',async (req,res) =>{
let posts = await Post.find();
res.send(posts);
});
app.post('/posts',async (req,res) =>{
let reqBody = req.body;
let imgPath;
if(reqBody.imageURL){
imgPath = reqBody.imageURL;
}else{
imgPath = req.file.path.substring(req.file.path.indexOf('/'), req.file.path.length);
}
let nwePost = new Post({
id : id++,
title : reqBody.title,
date : new Date(),
description : reqBody.description,
text : reqBody.text,
district : reqBody.district,
imageURL : imgPath
})
await nwePost.save();
res.send('Created');
});
答案 0 :(得分:0)
您没有在访问属性之前对其进行测试。问题在这里:
const imgPath = req.file.path.substring(req.file.path.indexOf('/'),
req.file.path.length);
在进行深度访问之前,应始终测试属性以验证其是否存在。这将保护您的应用程序免受这些错误的影响,这些错误在技术上称为“空指针异常”。这是JS中的问题。
因此,您应该始终执行以下操作:
const maybeFile = req.file
const maybePath = maybeFile ? maybeFile.path : undefined
const maybeImgPath = maybePath ? maybePath.substring(path.indexOf('/'), path.length) : undefined
// now maybeImgPath is either a path or undefined. Test it before using it
这说明了错误消息。
对于根本问题:
问题在于req
的形状。使用console.log(req)
进行检查。
您对它的形状的假设不正确,或者从前端发布数据时,您没有正确地在请求中传递数据。
无论哪种方式,您都应该在代码中针对undefined
进行防御性编程。
答案 1 :(得分:0)
您最好同时测试后端和前端。
对于您的前端:您是否使用new FormData()
作为请求正文?如果不这样做,请使用新创建的formData对象将值附加到表单字段中
https://developer.mozilla.org/en-US/docs/Web/API/FormData
对于您的后端,请console.log(req.file.path)
路线内的else block
中的app.post('/post',...)
,我建议您使用类似这样的文件名:
filename : (req, file, cb) => cb(null, Date.now() + '-' + file.originalname)
multer.diskstorage
中的文件名以避免重复的文件名。