добавить функцию промежуточного программного обеспечения в экспорт asyn c - PullRequest
0 голосов
/ 12 июля 2020

Я разделил свои маршруты с их определениями, чтобы мои маршруты выглядели следующим образом:

    const router = require('express').Router();
    const handle = require('../handlers');

    router.post('/register', handle.register);
// The handler defines the route. Like this:

    exports.register = async (req, res, next) => {
        try {
            const user = await db.User.create(req.body);
            const {id, username} = user;
            res.status(201).json({id, username});
        
            } catch (err) {
            if(err.code === 11000){
                err.message ='Sorry, details already taken';
            }
            next(err);
        }
    };

Это отлично работает. Теперь мне нужно загружать изображения по мере регистрации пользователей (с использованием промежуточного программного обеспечения Multer). Многие примеры показывают, что multer используется следующим образом:

    router.post('/register', upload ,function (req, res, next) {            //upload is the multer middleware
        console.log(req.file);
    })

Как мне добавить промежуточное ПО в моем случае?

1 Ответ

1 голос
/ 12 июля 2020

Вы добавляете промежуточное ПО следующим образом:

router.post('/register', upload, handle.register);

Как в примерах, которые вы видите.

В моем не очень скромном мнении

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

В обычной архитектуре MVC, которую вы видите на других языках, маршрут и обработчик маршрута вместе составляют контроллер . В своем дизайне вы разделили контроллер на две отдельные структуры. В первую очередь, это заставляет ваш лог c обработки маршрута и информацию о том, для какого маршрута он используется, существовать в двух отдельных файлах, когда они должны быть расположены очень близко друг к другу.

Теперь, когда вы добавляете промежуточное ПО, вы обнаруживают, что промежуточное ПО установлено в маршрутах, и с вашим дизайном трудно понять, какое промежуточное ПО установлено для вашего обработчика маршрутов.

следуйте шаблону проектирования MVC - отделите свою модель от вашего контроллера (представление бесплатно, потому что оно в основном res.json()).

По моему не очень скромному мнению, вы должны создать модель для своего user вместо разделения контроллеров на две части. Вашему пользователю, очевидно, нужна функция регистрации, и функция регистрации должна быть успешной или неудачной, но не должна беспокоиться о какой-либо обработке ошибок HTTP, потому что это работа контроллера:

exports.user = {
    // .. other methods

    register: async function (username, password) {
      try {
        const user = await db.User.create({username, password});
        return user;
      } catch (err) {
        if(err.code === 11000){
            err.message ='Sorry, details already taken';
        }
        throw err;
      }
    }
}

Затем в вашем контроллере (большинство Express пример вызова "route") вы делаете:

const user = require('./user');

router.post('/register', upload , async (req, res, next) => {
    try {
        const user = user.register(req.body.username, req.body.password);
        const {id, username} = user;
        res.status(201).json({id, username});        
    } catch (err) {
        next(err);
    }
})

Однако это только мое личное мнение.

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