#node.js #express #mongoose
#node.js #экспресс #mongoose
Вопрос:
Мне нужен результат Mongoose find().exec
в приведенном ниже формате. Можно ли так отформатировать результат?
var myFunction = function(foo, bar) {
model1.find({ elem: foo, elem2: bar }).exec(function(err, data) {
if (err) {
/* ... */
}
if (data) {
if (data.passed == true) {
return { passed: true, point: data.point };
} else {
return { passed: false, point: data.point };
}
} else {
return { passed: false, point: "not tried" };
}
});
};
object = {
...
someitem: array.map(function(arr) {
return {
_id: program._id,
title: program.title,
slug: program.slug,
status: myFunction(arr._id, arr._id2) /* Like This */
};
});
...
}
и извините меня за мой плохой английский: D
Комментарии:
1.
find(elem:foo,elem2:bar)
вероятно, должно бытьfind({elem:foo,elem2:bar})
2. Из данных вы только возвращаетесь
{ passed, point}
. Где пользователь получает массив, который вы упомянули? И в чем именно заключается ваш вопрос?
Ответ №1:
Вы должны вернуть обещание из функции, чтобы получить значения, которые поступают из запроса mongoose.Так что измените свою функцию на:
var myFunction = function(foo,bar) {
return new Promise(function(resolve, reject){
model1.find({elem : foo, elem2 : bar}).exec(function (err, data){
if(err){
/* Blablabla*/
reject(err);
}
if(data){
if(data.passed == true){
resolve({passed:true, point:data.point});
} else {
resolve({passed:false, point:data.point});
}
} else {
resolve({passed:false, point:'not tried});
}
});
});
}
Чем, если вы хотите вызвать функцию и получить значение, которое вам нужно сделать, например:
let promises, obj_elem = [];
for(let i =0;i < array.length;i ){
promises.push(myFunction(array[i]._id, array[i]. _id2));
}
/* You can't do it sync manner so you have to use some kind of async process */
Promise.all(promises).then((result)=>{
for(let i =0;i < result.length;i ){
obj_elem.push({
_id: program._id,
title: program.title,
slug: program.slug,
status: result[i].passed
});
}
console.log(obj_elem); //here you will have values you want
});
Комментарии:
1. мне нужно использовать данные для типа « obj_elem: array.map(function(arr) { return { _id: program._id, title: program.title, slug: program.slug, status: myFunction(arr._id, arr._id2) /* Вот так */ }; });«
2. @Л.Наран вы не можете использовать его синхронно, поэтому вам нужно использовать такие методы, как обратный вызов или обещание решить проблему. Обновленный ответ с использованием обещаний.
3. на самом деле мы не можем использовать .push, тип obj_elem не может быть массивом obj_elem == элемент объекта, это как object = {bla1:значение, bla2:значение, bla3:[bla3_inner1:{ bla3title:значение, /*и наш объект */ obj_elem }, bla3_inner2:{ bla3title:значение, /*и наш объект */ obj_elem }, ] ….. 😀
4. я не знаю, что это значит: D