【发布时间】:2019-06-16 10:44:53
【问题描述】:
我在 MongoDB 中使用 Nodejs(猫鼬和 express)。
由于我不信任用户数据,我需要从数据库中进行验证。
输入数据:
{
"id": "someid",
"nottrusteddata": [ {"id": "1"}, {"id" :"2"}]
}
在我的函数中,我正在验证数据:
router.post("/validate", (req, res,next) =>{
let validated_data = validate_data(req);
console.log(JSON.stringify(validated_data));
const mydata = new Mydata({
id: req.body.id,
lst : validated_data
});
console.log("mydata: " + JSON.stringify(mydata));
/* Some Usefull stuff is here */
res.status(200).json();
}
function validate_data(req){
let validated_data = []
for(let i = 0; i < req.body.nottrusteddata.length; i++)
{
Databaseobject.findOne({'id': req.body.nottrusteddata[i].id})
.exec()
.then(dbobject =>{
if(dbobject) // not undefined, it exists in the database
{
// Some logic with the object returned from the database
let tmp_object = {};
tmpobject.id = dbobject.id;
// Append it to the list, so that the upper function can use it
validated_data.push(tmp_object);
}
})
}
return validated_data;
}
所需的输出应该包含来自数据库的正确信息,但是,由于 nodejs 的异步特性,validated_data 返回 null。
我也尝试过使用Promise。我没能成功。
const validate_data = function(req){
return new Promise(function(resolve,reject){
let validated_data = []
for(let i = 0; i < req.body.nottrusteddata.length; i++)
{
Databaseobject.findOne({'id': req.body.nottrusteddata[i].id})
.exec()
.then(dbobject =>{
if(dbobject) // not undefined, it exists in the database
{
let tmp_object = {};
tmpobject.id = dbobject.id;
validated_data.push(tmp_object);
}
})
}
resolve(validated_data);
}
}
我做错了什么?如何等待数据库查询完成,然后执行主要部分?如果只有一个验证,我可以使用.then()。但是,该列表可能包含许多元素,我需要等待所有元素都得到验证。
【问题讨论】:
标签: node.js mongodb express mongoose promise