无法读取未定义的属性“路径”

时间:2020-02-27 10:23:16

标签: node.js multer

对于相同的问题,我已经找到了很多答案,但是我还没有找到可行的解决方案。我正在尝试制作一个可以使用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');
});

2 个答案:

答案 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)

您最好同时测试后端和前端。

  1. 对于您的前端:您是否使用new FormData()作为请求正文?如果不这样做,请使用新创建的formData对象将值附加到表单字段中
    https://developer.mozilla.org/en-US/docs/Web/API/FormData

  2. 对于您的后端,请console.log(req.file.path)路线内的else block中的app.post('/post',...)

,我建议您使用类似这样的文件名:
filename : (req, file, cb) => cb(null, Date.now() + '-' + file.originalname) multer.diskstorage中的文件名以避免重复的文件名。