如何在Expressjs中制作可重用的功能代码?

use*_*874 5 node.js express

我是ExpressJs中的新手和我项目中的模块模式.现在,我被困在如何在另一个控制器中使用创建的控制器功能.请看例子: -

menu.ctrl.js
------------

module.exports.save=function(req,res,next){
    //here some logic
    //somethings like validate req.body,etc
    menu.save(function(err){
      if(err) return next(err);
      res.json({msg:'menu save'})
    }) 
}

user.ctrl.js
------------

var user=require('./user.model')
var menuCtrl=require('./menu.ctrl')
module.exports.save=function(req,res,next){
   //here some logic
   user.save(function(err){
      if(err) return next(err);
      //HERE I WANT TO USE `menuCtrl.save()` function
      res.json({msg:'success'});
   })
}
Run Code Online (Sandbox Code Playgroud)

Nod*_*ode 6

将控制器逻辑与模型逻辑分离将允许您重用逻辑并使您的应用程序更易于维护.

这个想法是控制器的目的是格式化输入和输出应用程序,而模型处理实际的数据操作.(这是REST API的典型Rails-like MVC模式)

举个例子:

menuController.js

var menuModel = require('./menuModel');

module.exports.save = function(req, res, next) {
  menuModel.save(req.body, function(err) {
    if(err) return next(err);
    res.json({msg:'menu save'})
  });
};
Run Code Online (Sandbox Code Playgroud)

menuModel.js

module.exports.save = function(body, callback) {
  // Save menu to the DB
  menu.save(body, callback);
};
Run Code Online (Sandbox Code Playgroud)

userController.js

var userModel = require('./userModel');

module.exports.save = function(req, res, next) {
  userModel .save(function(err){
    if(err) return next(err);
    res.json({msg:'success'});
 });
}
Run Code Online (Sandbox Code Playgroud)

userModel.js

var menuModel = require('./menuModel');

module.exports.save = function(body, callback) {
  // Save user to the DB
  user.save(body, function(err, res) {
    if (err) return callback(err);
    menuModel.save(body, callback);
  });
};
Run Code Online (Sandbox Code Playgroud)

经验法则,在控制器中保持尽可能少的业务逻辑.

  • 就像我说的,你永远不应该调用控制器方法.这是路由器的工作.将您的逻辑放入模型中并调用它. (2认同)