Не удается прочитать свойство «путь» из неопределенного - PullRequest
0 голосов
/ 27 февраля 2020

Я посмотрел много ответов на этот же вопрос, но пока не нашел работающего решения. Я пытаюсь создать веб-приложение, в которое вы можете загружать файлы, используя express и multer, и у меня возникает проблема с тем, что файлы не загружаются, а '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 голосов
/ 27 февраля 2020

Вам лучше протестировать и свой бэкэнд, и внешний интерфейс.

  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) in multer.diskstorage чтобы избежать дублирования имен файлов.

0 голосов
/ 27 февраля 2020

Вы не тестируете свойства перед тем, как получить к ним доступ. Проблема здесь:

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 в своем коде, когда вы go.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...