Потому что вы делаете там некоторые асинхронные операции, но отправляете значение синхронно. По сути, этот код будет работать в следующем порядке:
- пробег
let translate='';
- пробег
['hello','love'].forEach(...)
- выполнить
await NaijaLang.find(...)
асинхронно для слова = привет
- запустить
await NaijaLang.find(...)
асинхронно для слова = любовь
- пробег
console.log(translate)
и res.send(translate);
- разрешить значение
await NaijaLang.find(...)
-> это время, когда translate
обновляется в первый раз (либо для слова = привет, либо слова = любовь. Что бы ни заканчивалось раньше)
- разрешить значение второго вызова
await NaijaLang.find(...)
-> это время, когда translate
обновляется во второй раз. Но значение уже было отправлено на 5 шаге.
Более подробное объяснение вы можете найти здесь: https://blog.lavrton.com/javascript-loops-how-to-handle-async-await-6252dd3c795
И там также можно найти, как это исправить. Вы можете использовать цикл for вместо forEach:
app.get('/translate',function(req,res){
let translate='';
for (let word of ['hello','love']) {
let trans=await NaijaLang.find({"engword":word,"naijalang":"yoruba"});
translate+=" " + trans[0].translation;
//Returns values
console.log(translate)
}
//Returns Empty String;
console.log(translate)
res.send(translate);
});
На этот раз код будет выполняться так, как вы, вероятно, хотите Сначала для word = hello будет вызван метод find
, затем после завершения выполнения будет вызван метод find
для word = love и, наконец, после завершения обоих вызовов будет вызван res.send
.