#node.js #mongodb #express #mongoose
#node.js #mongodb #выразить #мангуст
Вопрос:
В принципе, я хочу сохранить a user
внутри базы данных, перед выполнением этой операции мне нужно проверить поля этого user
. Итак, у меня есть эта структура:
exports.save = function(req, res)
{
let errors = validate(req.body);
if(!errors.length)
{
//add user
res.status(200).send(true);
}
else{
res.status(500).send("oh bad");
}
};
function validate(user)
{
let errors = [];
if (User.findOne({ email: user.email })) {
errors.push({ msg: 'Email already registered!' });
}
}
приведенный выше код просто не может работать, потому что NodeJS
обрабатывает операцию асинхронно. Я могу исправить эту «проблему», выполнив что-то вроде:
User.findOne({ email: email }).then(user => {
if (!user) {
//add user
res.status(200).send(true);
});
но я хочу добавить проверку внутри функции validate
, есть ли способ сделать это? Извините, если этот вопрос может показаться глупым, но я новичок в NodeJS
Комментарии:
1. @NikKyriakides Я знаю, как это сделать в обратном вызове javascript, я просто хочу знать, как это сделать в mongoose
2. Прошу прощения. Удаление.
3. @NikKyriakides нет проблем 🙂
4. @sfarzoso, если вы новичок в Node (и javascript в целом), вы должны понимать, что асинхронность — это особенность, а не проблема.
5. @MattKuhns Я знаю javascript, я просто новичок в Node 🙂 Мне действительно нравится технология Node
Ответ №1:
Поскольку ничто по своей сути не делает exports.save
синхронным, вероятно, проще всего сделать validate
асинхронным (и давайте также сделаем это современным, используя promises и async
).
exports.save = async function(req, res) {
const errors = await validate(req.body);
if (!errors.length) {
//add user
res.status(200).send(true);
} else {
res.status(500).send("oh bad");
}
};
async function validate(body) {
const errors = [];
const user = await User.findOne({ email: body.email });
if (user) {
errors.push({ msg: "Email already registered!" });
}
return errors;
}
Комментарии:
1. Другими словами, вы не можете сделать это в строго синхронном смысле.
2. Да, и это хорошо. В конце концов, синхронные операции в Node.js серверное приложение заблокирует его от обслуживания других запросов, поскольку узел является однопоточным.