Рефакторинг бизнес-логики из контроллера в сервис в Node.js - PullRequest
0 голосов
/ 29 октября 2019

Я изучаю 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. Как это исправить?

1 Ответ

0 голосов
/ 29 октября 2019

Если вы хотите, чтобы ту использовал обещания, используйте обещания, когда последовательность кодирования - золото. Если вы хотите использовать async await (синтаксический сахар для обещаний), всегда используйте async await.

Обещает обрабатывать ошибки с цепочкой в ​​конце.

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

Для асинхронного / ожидающего вы должны поставить

try { } catch (err) {}

В вашем случае это только говорит, что в любой из ваших асинхронных функций, содержащих обещание, вы должны обернуть их с помощью try catch,

Надеюсь, это поможет. Моя последняя рекомендация - сначала научись сначала, а потом - не смешивай их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...