Как сказал Сулейман в комментариях, это связано с асинхронной природой узла. Поток кода не похож на то, что вы ожидаете. В Интернете есть много учебников по асинхронной природе узла, и я предлагаю вам разобраться с ними и поэкспериментировать с ними, так как поначалу это не очень интуитивно понятно.
Из-за этого 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
, потому что:
- Вы печатаете содержимое переменной до того, как оно было заполнено запросом. .
- Вы не печатали содержимое переменной внутри обратного вызова.
Примечание : я изменил find()
в вашем коде на findOne()
. Я считаю, что find()
- опечатка с вашей стороны.