将业务逻辑从控制器重构为Node.js中的服务

时间:2019-10-29 12:16:12

标签: javascript node.js express

我正在学习Node.js,我在代码重构方面遇到问题。我了解了Node.js中的代码体系结构和良好的编码习惯,并且想重构我的代码。

我当前的代码:

user.controller.js

const bcrypt = require('bcryptjs');
const User = require('../models/user');

exports.createUser = (req, res, next) => {
  bcrypt.hash(req.body.password, 10)
    .then(hash => {
      const user = new User({
        email: req.body.email,
        password: hash
      });
      user.save()
        .then(result => {
          res.status(201).json({
            message: 'User created!',
            result: result
          })
        })
        .catch(err => {
          res.status(400).json({
            message: 'An unknown error has occurred.'
          })
        });
    });
}

我想将所有业务逻辑放入服务中。我尝试过这样的事情:

user.controller.js

const UserService = require('../services/user.service');

exports.createUser = async function (req, res, next) {

  try {
    var result = await UserService.createUser(req.body.email, req.body.password);
    return res.status(200).json({ result: result, message: "User created!" });
  } catch (e) {
    return res.status(400).json({ message: e.message });
  }

}

user.service.js

const bcrypt = require('bcryptjs');
const User = require('../models/user.model');

exports.createUser = async function (email, password) {

  bcrypt.hash(password, 10)
    .then(hash => {
      const user = new User({
        email: email,
        password: hash
      });
      user.save()
        .then(result => {
          return result;
        })
        .catch(err => {
          throw new Error(err);
        });
    });

}

但是我对诺言有很多错误:

(node:3760) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not ha
ndled with .catch(). (rejection id: 1)
(node:3760) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我是Node.js和JavaScript的新手。该如何解决?

2 个答案:

答案 0 :(得分:0)

如果您希望tu使用promise,则在编码一致性为黄金时使用promise。如果要使用异步等待(承诺的语法糖),请在每个地方坚持使用异步等待。

Promise处理错误,最后使用链式捕获。

MyPromise().then(() => bar).catch((err) =>  do something with err )

对于异步/等待,您应该放置

try { } catch (err) {}

在您的情况下,它只是说在任何包含诺言的异步函数中,都应使用try catch将它们包装起来。

希望有帮助。我上一次的推荐是先学习一种方法,然后再学习另一种方法,不要混在一起。

答案 1 :(得分:0)

谢谢您的回答。我修改了代码,现在看起来像这样:

user.controller.js

const UserService = require('../services/user.service');

exports.createUser = async function (req, res, next) {

  try {
    let user = await UserService.createUser(req.body.email, req.body.password);
    return res.status(201).json({ data: user, message: 'User created!' });
  } catch (e) {
    let errorMsg;
    let statusCode;
    if(e.errors['email'].kind === 'unique') {
      statusCode = 422;
      errorMsg = 'E-mail already exists.';
    } else {
      statusCode = 500;
      errorMsg = 'An unknown error has occurred.';
    }
    return res.status(statusCode).json({ message: errorMsg });
  }

}

user.service.js

const bcrypt = require('bcryptjs');
const User = require('../models/user.model');

exports.createUser = async function (email, password) {
  const hash = bcrypt.hashSync(password, 10);
  const user = new User({
    email: email,
    password: hash
  });
  await user.save();
  return result;
}

我的代码正确吗?我说的是编码架构。工作正常,但是我不确定我的代码是否是“良好实践”编程。我问是因为我想开始编写整个后端,但是我不确定我的代码。

我认为这段代码看起来不太好:

  } catch (e) {
    let errorMsg;
    let statusCode;
    if(e.errors['email'].kind === 'unique') {
      statusCode = 422;
      errorMsg = 'E-mail already exists.';
    } else {
      statusCode = 500;
      errorMsg = 'An unknown error has occurred.';
    }
    return res.status(statusCode).json({ message: errorMsg });
  }

例如,在其他控制器中,我将有5个If语句。这是正确的解决方案吗?我正在征求意见,可以在此处进行哪些更改以使代码更专业。

相关问题