Как вызвать Mon goose Find функцию для извлечения всех документов в виде массива? - PullRequest
0 голосов
/ 17 февраля 2020

Я все еще новичок в Node.js и Пн goose и не знаю, почему этот код не возвращает массив. Любые предложения?

function all(array){
    array = card.cards.find({}, (err, items) => {
        array = items
        return array
    })
}

let arr = []
all(arr)
console.log(arr)

Конечный результат - просто пустой массив.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

У вас 2 проблемы.

1. Невозможно переназначить переменную, переданную в качестве параметра внутри функции:

var a = 1;
function fn(b) {
  b = 2;
}
fn(a);
a === 1; // true

Кроме того, это плохой шаблон для изменения данных внутри функций, когда это не нужно. Лучше просто вернуть и назначить во внешней области видимости:

function all() {
  return card.cards.find({});
}
all(a).then(console.log); // [...]

Но вы можете изменить массив без переназначения:

var a = [1, 2, 3];
function fn(array) {
  array.splice(0, Infinity, ...[5, 6, 7, 8]);
}
a; // [1, 2, 3]
fn(a);
a; // [5, 6, 7, 8]

2. Asyn c вызывает Mon goose и asyn c -aaait / promises

Тем не менее, даже если вы возвращаете это из функции all, вам придется ждать результата.

Calls в понедельник goose методы asyn c. Это означает, что они возвращают объекты Promise (или обещания), которые реализуют интерфейс с методами then и catch. Функция, переданная методу then, будет вызвана, если обещание будет успешно разрешено, а функция в catch будет вызвана, если обещание будет отклонено.

Например,

function p() {
  if (Math.random() > 0.5) {
    return Promise.resolve(1);
  } else {
    return Promise.reject(new Error('2'));
  }
}

p()
  .then(function (result) { /* will be called half of time for resolve branch */ })
  .catch(function (error) { /* will be called for reject branch */ })

Этот код похож на, но использует syntacti c sugar:

async function p() {
  if (Math.random() > 0.5) return 1; // Similar to return Promise.resolve(1);
  throw new Error('2'); // Similar to return Promise.reject(new Error('2'))
}

Для ожидания обещаний внутри функции asyn c есть ключевое слово await.

async function all() {
  try {
    return await cards.find({});

  } catch(error) {
    if (false /* somehow handle mongoose errors */) {
      // check error, if db not ready just retry or do sth else
      // …
    }

    // Just rethrow if we can't do any
    throw error;
  }
}

Подробнее об asyn c -wait: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

0 голосов
/ 17 февраля 2020

Вам не нужно передавать массив, вы можете вернуть элементы, которые возвращены методом .find ().

function getAll(){
    card.cards.find({})
         .then(items => {
             return items 
         }
         .catch(err => {
             console.log(err)
         }
}
...