Я работаю над приложением для ведения блогов (нажмите на ссылку, чтобы увидеть < strong> репозиторий GitHub с экспресс, EJS и MongoDB.

Я пытаюсь внедрить функцию добавить изображение поста в Multer. Будучи совершенно новым для Экспресса, я столкнулся с проблемой.

В utils\imageupload.js я добавил:

const multer = require("multer");

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
            cb(null, './uploads/images')
    },
    filename: function (req, file, cb) {
            cb(null, file.fieldname + '-' + Date.now() + '.png')
    }
});

exports.upload = multer({ storage: storage }).single('postimage');

Я импортирую и использую это в моем файле маршрутов приборной панели:

const imageUploader = require('../../utils/validation.js');

//more code

// Add Post
router.post('/post/add', imageUploader.upload, validator.addPostCheck, dashboardController.addPost);

//more code

В контроллере у меня есть (среди прочих):

exports.addPost = (req, res, next) => {

    upload(req, res, function(err) {
        if (err) {
            console.log("There was an error uploading the image.");
        } else {
            res.sendStatus(200);
        }
    })

    var form = {
        titleholder: req.body.title,
        excerptholder: req.body.excerpt,
        bodyholder: req.body.body
    };

    const errors = validationResult(req);

    const post = new Post();

    post.title = req.body.title;
    post.short_description = req.body.excerpt
    post.full_text = req.body.body;

    if (!errors.isEmpty()) {
        req.flash('danger', errors.array())
        res.render('admin/addpost', {
            layout: 'admin/layout',
            website_name: 'MEAN Blog',
            page_heading: 'Dashboard',
            page_subheading: 'Add New Post',
            form: form
        });
    } else {
        post.save(function(err) {
            if (err) {
                console.log(err);
                return;
            } else {
                req.flash('success', "The post was successfully added");
                req.session.save(() => res.redirect('/dashboard'));
            }
        });
    }
}

Пока строка imageUploader.upload находится в контроллере, все приложение просто аварийно завершает работу с ошибкой: Route.post() requires a callback function but got a [object Undefined] error.

Что я делаю не так?

0
Razvan Zamfir 10 Апр 2020 в 17:14

2 ответа

Лучший ответ

У вас есть следующая строка:

const imageUploader = require('../../utils/validation.js');

validation.js не экспортирует upload, который вы используете здесь:

// Add Post
router.post('/post/add', imageUploader.upload, validator.addPostCheck, dashboardController.addPost);

Изменение импорта на

const imageUploader = require('../../utils/imageupload.js');

Должен решить проблему.

Что касается проблемы в панели администратора-администратора: поскольку вы уже вызывали загрузку мультитера, вы можете удалить ее в addPost, req теперь должен содержать загруженный файл.

exports.addPost = (req, res, next) => {
    // removed the upload code
    var form = {
            titleholder: req.body.title,
            excerptholder: req.body.excerpt,
            bodyholder: req.body.body
    };
    ...
0
eol 10 Апр 2020 в 17:17

Выдает такой тип ошибки, когда маршрутизатор не может вызвать метод, пожалуйста, проверьте метод вызова в маршрутизаторе.

0
vishal sharma 13 Апр 2020 в 20:37