Mongoose присваивает результат поиска findOne () переменной - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть функция:

function RetrieveCountryCode(countryName, callback) {
  Country.find({ name: countryName }, function(err, country) {
    if (err) {
      callback(err, null);
    } else {
      callback(null, country.code);
    }
  });
}

Я использую ее так:

//find a country code of a given country by user
var userCountryCode = null;
RetrieveCountryCode(country, function(err, countryCode) {
  if (err) {
    console.log(err);
  }
  userCountryCode = countryCode;
});
console.log("COUNTRY CODE");
console.log(userCountryCode);

* Параметр "страна", данный функции, взят из формы HTML, он передан правильноЯ проверил это.

И я все еще получаю тот же ответ в консоли: COUNTRY CODE null . Что я делаю не так ...?

1 Ответ

1 голос
/ 08 ноября 2019

Как сказал Сулейман в комментариях, это связано с асинхронной природой узла. Поток кода не похож на то, что вы ожидаете. В Интернете есть много учебников по асинхронной природе узла, и я предлагаю вам разобраться с ними и поэкспериментировать с ними, так как поначалу это не очень интуитивно понятно.

Из-за этого console.log(userCountyCode) был выполнен до RetrieveCountryCode() может закончить свою работу.

Решение состоит в том, чтобы поместить console.log(userCountyCode) в обратный вызов.

Например, если моя коллекция содержит:

> db.countries.find()
{ "_id" : ObjectId("5dc4fcee86c118c901a7de35"), "name" : "Australia", "code" : "61", "__v" : 0 }

Используя измененную версию имеющегося у вас кода:

var userCountryCode = null;
var country = 'Australia';

mongoose.connect(url, opts)

function RetrieveCountryCode(countryName, callback) {
  Country.findOne({ name: countryName }, function(err, country) {
    if (err) {
      callback(err, null);
    } else {
      callback(null, country.code);
    }
  });
}

RetrieveCountryCode(country, function(err, countryCode) {
  if (err) {
    console.log(err);
  }
  userCountryCode = countryCode;
  console.log("COUNTRY CODE");
  console.log(userCountryCode);
});
console.log('xxx');

Обратите внимание, что я совсем не изменил определение функции RetrieveCountryCode. Я просто изменил способ его вызова и переместил console.log внутри обратного вызова. Вместо этого я поставил console.log('xxx') на его место.

Запуск этого кода выводит:

xxx
COUNTRY CODE
61

Обратите внимание, что xxx было напечатано до кода страны, так как оно быловыполняется до того, как обратный вызов напечатает результат запроса.

Итак, ваш код всегда печатает null, потому что:

  1. Вы печатаете содержимое переменной до того, как оно было заполнено запросом. .
  2. Вы не печатали содержимое переменной внутри обратного вызова.

Примечание : я изменил find() в вашем коде на findOne(). Я считаю, что find() - опечатка с вашей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...