从Express路由器中分离逻辑并仍然访问Express函数

时间:2017-12-02 15:02:26

标签: javascript node.js express model-view-controller

我已经开始使用Node.js和Express编写我的第一个应用程序,但我的路由器文件变得非常混乱。在我看来,它包含太多的逻辑。

我正在尝试将另一个文件(Parent.controller.js)中的函数传递给路由器,而不是将我的逻辑放在匿名函数中。

所以,就像这样:

Router.post('/create-child', Parent.createChild);

而不是:

Router.post('/create-child', function(req, res, next) {
    // do something
    // do something else
    // do even more stuff
    // this is getting messy
    // oh dear
});

但我不知道如何从Parent.controller.js中的函数触发重定向或保存闪存数据。这是因为我不确定如何仍然访问req中的resParent.controller.js个对象。我们将非常感激地收到任何建议。

3 个答案:

答案 0 :(得分:2)

reqres只是作为参数传递给控制器​​函数的普通对象。您不必在 Parent.controller.js 中要求任何特殊内容。只需确保createChild的参数为reqres。如果您需要,请next。像这样:

module.exports.createChild = (req, res, next) => {
   res.status(200).json({ message: 'OK' });
}

当然,您必须在路线文件中要求快递:

const express = require('express');
const Parent = require('Parent.controller');

const router = express.Router();

Router.post('/create-child', Parent.createChild);

答案 1 :(得分:2)

您可以将所有函数包装在对象中并像这样导出它 -

Parent.controller.js

function createChild(req, res, next) {
  // do your thing here
}

// Add more functions

// Export module

module.exports = {
  createChild,
  ... // other functions
}

然后将其添加到路由器中,如此 -

const Parent = require('./Parent.controller.js');

Router.post('/create-child', Parent.createChild);

或者你可以去上课路线 -

Parent.controller.js

class Parent {
  constructor() {
    // fill constructor info
  }

  createChild(req, res, next) {
    // do your thing here
  }
}

module.exports = Parent;

您的路由器 -

const Parent = require('./Parent.controller.js');
const parent = new Parent();

Router.post('/create-child', parent.createChild);

答案 2 :(得分:1)

你究竟尝试了什么?访问req,res应该非常简单,

(module.exports.)createChild = function(req,res){
    childName = req.child_name; 
    ..........
    your child genesis code
    .....
    res.send('Child created')
}

根据重定向,您可以使用res.redirect()触发它们,但是,如果您想将用户重定向到另一个页面,我建议您res.status(307).send或类似的东西给您前端将捕获状态代码并触发window.assign()或类似的东西。