【问题标题】:How to Separate Router from Controller in Express App?如何在 Express App 中将路由器与控制器分离?
【发布时间】:2019-07-23 09:49:46
【问题描述】:

我想将路由与控制器分开。

我试过这种方法:

routes/index.js

var express              = require('express');
var router               = express.Router();
var wordMapperController = require('../controller/wordmapper');

router.get('/', wordMapperController());

module.exports = router;

控制器/wordmapper.js

var __construct = function(req, res, next) {
    res.render('index', { title: 'Word Mapping for Sanskrit-Indonesian in BG' });

    next();
}

module.exports = __construct;

当我启动时 res 是未定义的,并阻止应用程序启动。 我该如何处理? app.use和handle路由中间件是如何被传递的?

【问题讨论】:

    标签: node.js express model-view-controller design-patterns


    【解决方案1】:

    你得到res 的原因是undefined 是因为你正在调用wordMapperController 函数,然后将它返回的内容(在这种情况下未定义,因为你不返回任何东西)作为回调router.get 方法...

    这是你应该做的:

    routes/index.js

    router.get('/', wordMapperController);
    

    此外,没有理由在您的 controller/wordmapper.js 文件中调用 next()...

    来自express.js 文档:

    如果当前中间件函数没有结束请求-响应循环,它必须调用 next() 将控制权传递给下一个中间件函数。否则,请求将被挂起。

    在您的情况下,您将使用 res.render 方法调用结束您的请求-响应周期,因此您应该只这样做:

    控制器/wordmapper.js

    var __construct = function(req, res, next) {
        res.render('index', { 
            title: 'Word Mapping for Sanskrit-Indonesian in BG' 
        });
    }
    

    【讨论】:

    • 谢谢。那是我的错,我调用的是函数而不是返回对象。
    【解决方案2】:

    你做得很好。但是小的改动会让你的应用看起来很完美。在下面找到它们。

    1. 将“router.get('/', wordMapperController())”行更改为
      "router.get('/', wordMapperController)" - 因为当到达路由 "/" 时,它 将通过传递请求、响应调用控制器中的中间件函数 和 next 作为参数;
    2. 如果要渲染模板,则必须设置模板引擎服务器文件- 例如:app.set('view engine', 'pug') (如果是 .pug 文件);

    3. 如果您在执行上述操作时遇到任何问题,请告诉我。

    供参考,您可以通过此链接-https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2022-12-03
      • 1970-01-01
      • 2018-05-16
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多