Я использую Nodejs с MongoDB (mongoose вместе с 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;
}
Требуемый вывод должен содержать правильную информацию, поступающую из базы данных, однако, из-за асинхронной природыиз узлаjs validated_data
возвращает ноль.
Я также пытался использовать 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()
.Однако список мог содержать много элементов, и мне нужно подождать, пока все они будут проверены.