использование multer для передачи memoryStorage для выражения с помощью ajax, но req.file не определен - PullRequest
0 голосов
/ 23 сентября 2018

Я знаю, что здесь довольно много сообщений в stackoverflow, спрашивающих, что req.file не определен, я просмотрел довольно много, и большинство из них называет имена, хотя я не думал, что именно так я получаю undefined.

Это мой html (мопс). Я не использую форму, поскольку я просто использую ввод при изменении

                    input#avatar-file(type='file', name='avatar')
                    button#add-avatar-btn.btn.btn-info Add Avatar

мой ajax

s = {
    onClick: () => {
        $('#add-avatar-btn').on('click', function (e) {
            e.preventDefault();
            $('#avatar-file').click();
        });
    },
    onChange: () => {
        $('#avatar-file').on('change', function (e) {
            e.stopPropagation();
            e.preventDefault();

            let file = e.target.files;
            if (file.length === 1) {
                let formData = new FormData();
                formData.append('avatar', file);
                console.log(formData, 'formdata');  // this gives me -> FormData {} "formdata"
                s.runAjax(formData);
            }
        });
    },
    runAjax: dataValue => {
        $.ajax({
            method: 'post',
            url: '/avatar/upload',
            data: dataValue,
            contentType: false,
            processData: false,
            success: data => {
                console.log(data, 'data success return');
            },
            error: err => {
                console.log(err, 'err return ');
            }
        });
    },
};

s.onClick();
s.onChange();

моя экспресс-часть

const multer  = require('multer');
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

router.post('/avatar/upload',  upload.single('avatar'), async (req, res, next) => {
    try {

        console.log(req.body.avatar, 'req.body.avatar');  // { avatarUrl: '[object FileList]' } 'req.body'
        console.log(req.files, 'request files');  // undefined
        console.log(req.file, 'single file');  // undefined
        return res.json({status: true});
    } catch (err) {
        return next(err);
    }
});

В какой части я делаю это неправильно?Я на самом деле пытаюсь использовать память, чтобы она сохранялась в виде буфера, а затем загружала ее в s3 после того, как вместо сохранения изображения локально.

Но я застряла здесь.

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 23 сентября 2018

Это не работает, потому что вы отправляете массив вместо файла.

Do

formData.append('avatar', file[0]);

вместо

formData.append('avatar', file);
...