JavaScript NodeJ-如何重构此位

时间:2019-07-14 13:39:57

标签: javascript node.js mongodb express

因此,我正在创建一个简单的CRUD应用程序,但是我偶然发现了最新创建的帐户的MongoDB自动递增值。

更具体地说,我在下面编写了tidbit以启用以下功能:

1)注册时,请进行一些验证检查

2)检查什么是最新的帐号,以1为增量

3)创建一个新用户,添加到数据库中

现在,如果您在下面看到,我已经标记了三个附件

1&2)由于某些奇怪的原因,如果我从路由本身中删除代码,则它会停止正常工作,但是由于功能几乎相同,我不知道如何消除重复的代码,但是删除这些只是打破顺序。如何解决此问题并使代码更整洁?

3)我将如何将该函数提取到单独的函数中?摆弄这个之后,我只能说到“没有定义accountNumber”。

const getLastAccountNumber = function() {
  User.find({}, { accountNumber: 1, _id: 0 }) **// EXHIBIT 1**
    .sort({ accountNumber: -1 })
    .limit(1)
    .then(function(doc) {
      if (!doc) throw new Error("Error?");
      accountNumber = doc[0].accountNumber;
      return doc[0].accountNumber;
    });
};
// TODO: Refactor methods

router.post(
  "/register",
  [check("email").isEmail(), check("password").isLength({ min: 4 })],
  function(req, res) {
    User.find({}, { accountNumber: 1, _id: 0 }) **// EXHIBIT 2**
      .sort({ accountNumber: -1 })
      .limit(1)
      .then(getLastAccountNumber())
      .then(function() { **// EXHIBIT 3**
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          return res.status(422).json({ errors: errors.array() });
        }
        const { email, password } = req.body;
        const amount = 0;
        accountNumber++;
        const user = new User({
          email,
          password,
          accountNumber,
          amount
        });
        user.save(function(err) {
          if (err) {
            console.log(err);
            res.status(500).send("Error registering new user");
          } else {
            res.status(200).send("User successfully added");
          }
        });
      });
  }
);

真的很感谢您的反馈!

2 个答案:

答案 0 :(得分:1)

关于您的错误,我相信通过在文件顶部添加let accountNumber;来定义变量可能足以使您的代码正常工作(尽管我认为这不是一个很好的解决方案... ),尽管您询问重构的问题:

    拥抱承诺:想象一下水/数据流经一系列管道,并且在每个步骤中,数据都可以转换。保持这种线性流动通常可以使代码整洁并易于遵循。如果在执行过程中发生任何错误,将跳过直到“ catch”为止的所有管道。
  • 如果发生错误,而我们直接“捕获”,则可能需要根据故障原因以不同的方式处理情况。因此,我们可以添加ValidationError之类的错误包装程序进行检查。
  • 此外,我们可以正确命名管道,例如getNewAccountNumber,即使数据库中没有帐户,该管道也可以使用
  • 箭头功能很好

// error handling

class ValidationError {
  constructor (errors) {
    this.errors = errors
  }
}

const checkValidation = (req, res)=> {
  const errors = validationResult(req)
  return errors.isEmpty()
    ? Promise.resolve()
    : Promise.reject(ValidationError(errors.array()))
}

const successResponse = (req, res, data)=> ()=> res.status(200).send(data)
const errorResponse = (req, res, message = 'Internal Server Error')=> error=>
    error instanceof ValidationError ? res.status(422).json({ errors: error.errors })
  : (console.error(error), res.status(500).send(message))


// utils

const initialAccountNumber = 0
const getNewAccountNumber = ()=> User
  .find({}, { accountNumber: true, _id: false })
  .sort({ accountNumber: -1 })
  .limit(1)
  .then(xs=> !xs || !xs.length
    ? initialAccountNumber
    : xs[0].accountNumber + 1)


// route

router.post('/register', [
  check('email').isEmail(),
  check('password').isLength({ min: 4 })
], (req, res)=> checkValidation(req, res)
  .then(getNewAccountNumber)
  .then(newAccountNumber=> {
    const { email, password } = req.body
    return new User({
      email,
      password,
      accountNumber: newAccountNumber,
      amount: 0,
    })
  })
  .then(user=> user.save())
  .then(successResponse(req, res, 'User successfully added'))
  .catch(errorResponse(req, res, 'Error registering new user'))
)

无论如何,如果可能的话,我希望通过使用现有的db-build-in解决方案作为一个事务来完成(例如,_id已经“保证”是唯一的,使用该解决方案的accountNumber不太多)。

答案 1 :(得分:0)

您可以执行以下操作:

const getLastAccountNumber = function() {
  return User.find({}, { accountNumber: 1, _id: 0 })
    .sort({ accountNumber: -1 })
    .limit(1)
    .then(function(doc) {
      if (!doc) throw new Error("Error?");
      return doc[0].accountNumber;
    });
};

router.post(
  "/register",
  [check("email").isEmail(), check("password").isLength({ min: 4 })],
  function(req, res) {
    getLastAccountNumber().then((accountNumber) => {
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.status(422).json({ errors: errors.array() });
      }
      const { email, password } = req.body;
      const amount = 0;
      accountNumber++;
      const user = new User({
        email,
        password,
        accountNumber,
        amount
      });
      user.save(function(err) {
        if (err) {
          console.log(err);
          res.status(500).send("Error registering new user");
        } else {
          res.status(200).send("User successfully added");
        }
      });
    });
  }
);