【问题标题】:Seperation of concerns (service and router layer)关注点分离(服务层和路由器层)
【发布时间】:2021-11-15 03:06:03
【问题描述】:

我想提高我在 Node JS 方面的技能。现在我对如何清晰地分离应用程序的服务层和路由器层感兴趣,这样我就可以避免代码重复之类的事情。
以用户方案的create method为例。

UserService.Js 中,我为此存储了以下方法:

function createUser(req, res, next) {

  let user = new User({
    userID: req.body.userID,
    userName: req.body.userName,
    password: req.body.password,
    isAdministrator: req.body.isAdministrator
  });
  user.save().then(function() {
    res.send(user);
  }).catch(err => {
    console.log(err);
  });

}

以下代码存储在UserRouter.Js

router.post('/publicUser', userService.createUser)

代码有效,但关注点分离没有得到尊重。 如何现在用回调函数编写创建函数

我的尝试如下所示:

UserService.js  

function createUser() {

  let user = new User
  return user;
}

UserRoute.js    

    router.post('/publicUser',function(req,res,next){
  let newOne=userService.createUser()
  newOne.userID=req.body.userID
  newOne.userName=req.body.userName
  newOne.password=req.body.password
  newOne.isAdministrator=req.body.isAdministrator
  newOne.save().then(function() {
        res.send(newOne);
      }).catch(err => {
        console.log(err);
      })})

它有效。但是是否存在更优雅的方式?

【问题讨论】:

  • 你想解决什么问题?
  • 这个想法是使用关注点分离的原则将业务逻辑从node.js API Routes中移开。所以我不想将 req 或 res 对象传递给服务层。
  • 好的,所以只需将您当前拥有的所有内容放在createUser 作为router.post 的回调,然后将user.save()“业务逻辑”部分移动到一个单独的函数中。不要使用额外的回调。让它返回承诺。
  • 好的,那么这个例子会是什么样子?
  • 就像我描述的那样?请edit你的问题表明你的尝试,或者详细说明你卡在哪里

标签: javascript express callback separation-of-concerns


【解决方案1】:

以下是让您了解实现的代码。您可以根据复杂性和要求进一步增强。

UserRouter.Js

// import service here
router.post('/publicUser', createUser)

async function createUser(req, res, next) {
    try {
        const response = await UserService.createUser(req.body);
        res.send(response); // Enhance 'res' object here and return as per your requirement.
    } catch (error) {
        // log error
        res.status(500).send(''); // Enhance 'res' object here with error and statuscode and return as per your requirement.
    }
}

UserService.Js

async function createUser(body) {
    // check emptiness if any for body and throw proper errors.
    let userModelData = UserModel.getUserInsertPayload(body);
    return UserRepository.save(userModelData);
}

UserRepository.js

// all code related to persistance. This is separate layer.
async function save(user) {
    // Do any enhancement you need over the payload.
    return User.save(user);
}

UserModel.js

// import User here. Create a payload related to User specific requirements.
function getUserInsertPayload(body) {
    return new User({
        userID: req.body.userID,
        userName: req.body.userName,
        password: req.body.password,
        isAdministrator: req.body.isAdministrator
    });
}

【讨论】:

  • 好的,但是如何编写带有回调的 UserService 和 UserROuter 交互?
  • @pawl123 你不需要回调
  • @Ankur 我不认为UserService 应该与整个request 交互(更不用说resnext)。仅从路由器传递主体。
  • 亲爱的@Bergi,我刚刚试图给出一个非常高级的想法。应用需求和专业知识并达到预期结果完全取决于开发人员。但我同意并更改了我的答案。谢谢,干杯!
猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2011-05-15
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多