【问题标题】:add middleware function to an async export将中间件功能添加到异步导出
【发布时间】:2020-11-01 18:33:45
【问题描述】:

我已将路线与其定义分开,因此我的路线如下所示:

    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);
    })

如何在我的情况下添加中间件?

【问题讨论】:

    标签: express mongoose multer


    【解决方案1】:

    你像这样添加中间件:

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

    就像你看到的例子一样。

    在我不那么谦虚的意见中

    您提到您已将路线与路线处理程序分开。在我看来,这不仅是误导,而且是完全错误的。

    在您在其他语言中看到的通常 MVC 架构中,路由和路由处理程序共同构成 控制器。在您的设计中,您已将控制器拆分为两个独立的结构。首先,这使您的路线处理逻辑和路线信息存在于两个单独的文件中,而它们应该彼此非常靠近。

    现在您正在添加中间件,您会发现中间件已安装在路由中,而根据您的设计,很难弄清楚为您的路由处理程序安装了哪些中间件。

    将业务逻辑与路由分离的正确方法是遵循 MVC 设计模式 - 将模型与控制器分离(视图是免费的,因为它基本上是 res.json())。

    在我不太谦虚的意见中,您应该为您的用户创建一个模型,而不是将控制器分成两部分。您的用户显然需要注册功能,注册功能应该成功或失败,但不应该关注任何 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 示例调用“路由”):

    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);
        }
    })
    

    不过,这只是我个人的看法。

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 2019-01-02
      • 2018-01-25
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 2016-04-24
      相关资源
      最近更新 更多