Нужна помощь для mongoose .find()

#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