在我正在开发的项目/web应用程序中,用户可以创建一个新的帖子。他们创建的帖子中需要文本,照片是可选的。
我希望相关的app.post语句根据帖子中是否包含图片来执行不同的操作。这是我的代码:
app.post('/posts/store', async(req,res)=>{
if(req.files.image===null){
await BlogPost.create({...req.body,userid:req.session.userId});
res.redirect('/')
}
else {
let image = req.files.image;
image.mv(path.resolve(__dirname, "public/img",image.name),async(error)=>{
await BlogPost.create({...req.body, image:"/img/"+image.name, userid:req.session.userId});
res.redirect('/')
});
};
})
如果帖子中没有图像,那么就不应该有req.files.image这样的值。我的想法是用一个"If语句"来检查这个值是否存在,如果不存在,那么就会遵循相关逻辑,以便发布帖子。如果包含else语句覆盖的图像,则需要不同的逻辑。
我尝试过";如果(req.files.image===null(";但什么都不管用。我收到错误消息"UnhandledPromiseRejectionWarning:TypeError:无法读取null的属性"image"。
然而,如果上传了图片,代码确实有效(代码首先跳过"if",转到"else"指令(。如果我用一个明显真实的语句替换"req.files.image===null",然后上传一篇没有照片的博客文章,代码也会起作用。有了这一点,我想我至少已经确定了错误所在——在代码的"if(req.files.image===null("行中——而不是代码中的任何其他地方,但我仍然无法解决它
您在使用中间件吗?
在Express4中,req.files在req对象上默认不再可用。要访问req.files对象上上传的文件,请使用多部分处理中间件,如busboy、multer、awebrable、multiparty、connect multiparty或pez。(https://expressjs.com/en/4x/api.html#req)
看起来req.files
为空。尝试
if(!req.files || !req.files.image) {
// req.files.image == null
} else {
// req.files.image != null
}
您可能正在使用multer(或类似的(lib来处理随文件上传的表单数据。如果给定了一个文件,这些库通常只填充req.files
字段。如果不是,则为undefined
。你应该延长你的检查,看看req.files
是否存在,例如:
if(!req.files || req.files.image === null) {
await BlogPost.create({...req.body,userid:req.session.userId});
res.redirect('/')
}