因此,我正在创建一个简单的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");
}
});
});
}
);
真的很感谢您的反馈!
答案 0 :(得分:1)
关于您的错误,我相信通过在文件顶部添加let accountNumber;
来定义变量可能足以使您的代码正常工作(尽管我认为这不是一个很好的解决方案... ),尽管您询问重构的问题:
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");
}
});
});
}
);