Получить значение из функции, а затем сделать ее глобальной - PullRequest
0 голосов
/ 09 января 2019

Как я могу получить значение из функции, чтобы использовать его при публикации данных в базу данных? Здесь я хочу сделать значение imageName внутри multer.diskStorage глобальным, чтобы использовать его при публикации пути к базе данных

var imageName;
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './public/assets/images');
    },
    filename: function (req, file, cb) {
        if (!file.originalname.match(/\.(png|jpg|jpeg)$/)) {
            var err = new Error();
            err.code = 'filetype';
            return cb(err);
        } else {
            imageName = Date.now() + '_' + file.originalname;
            cb(null, imageName);
        }
    }
});

router.post('/newsfeeds', parser.single("myfile"), function (req, res) {

    newsfeed.path = imageName;
    newsfeed.save(function (err) {
    });
});

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Глобальные переменные, как правило, недовольны в сообществе программистов, поэтому вам следует сначала спросить себя, действительно ли это то, что вы хотите сделать.

Если вы решите, что это лучший подход, то в Node вы можете присоединить свойство к переменной global. В браузере вы можете прикрепить его к window.

Что касается вашей проблемы с порядком выполнения (из комментариев ОП), вы можете добавить Promise вместо значения в глобальную область. Затем в любое время, когда вам нужно это значение, вызовите .then() для вашего значения или запустите его в async function с await.

0 голосов
/ 09 января 2019

Это способ реализации multer. Вы можете использовать upload как функцию или как промежуточное ПО, я использую его как функцию, потому что это позволяет мне более детально обрабатывать ошибки.

Не было необходимости в глобальной переменной, в этом случае, когда multer обрабатывает изображение, заполняет свойство req.file информацией изображения, так как мы перезаписываем функцию filename, теперь в req.file.filename это пользовательское значение, которое нам нужно.

const multer = require('multer');

const multerStorage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './public/assets/images');
    },
    filename: function (req, file, cb) {
        if (!file.originalname.match(/\.(png|jpg|jpeg)$/)) {
            var err = new Error();
            err.code = 'filetype';
            return cb(err);
        } else {
            const imageName = Date.now() + '_' + file.originalname;
            cb(null, imageName);
        }
    }
});

const upload = multer({ storage: multerStorage }).single('myfile');


router.post('/newsfeeds',(req, res) => {
    upload(req, res, function (err) {
        if (err || !req.file) {
            // An error occurred while loading the image.
            return res.status(400);
        }
        newsfeed.path = req.file.filename;
        newsfeed.save(function (err) {
        });
    });
});

Здесь вы можете найти таблицу с остальными свойствами изображения что у вас есть после multer обработки изображения. Документация

...