请我尝试将字符串结果连接到快速路由器中的变量,但它 returns 是一个空字符串

Please I am trying to concatenate string result to a variable in an express router but it returns an empty string

我正在尝试遍历数组获取值并搜索数据库,然后将数据库结果连接到字符串翻译

app.get('/translate',function(req,res) {
  let translate = '';
  ['hello','love'].forEach(async (word) => {
  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);
});

因为你在那里做了一些异步的事情,但是你同步发送了值。基本上,此代码将按以下顺序 运行:

  1. 运行 let translate='';
  2. 运行 ['hello','love'].forEach(...)
  3. 运行 await NaijaLang.find(...) 异步 for word=hello
  4. 运行 await NaijaLang.find(...) 异步 for word=love
  5. 运行 console.log(translate)res.send(translate);
  6. 解析 await NaijaLang.find(...) 的值 -> 这是 translate 第一次更新的时间(word=hello 或 word=love。无论何时完成)
  7. 解析第二次调用的值await NaijaLang.find(...) -> 这是translate第二次更新的时间。但该值已在第 5 步发送。

您可以在这里找到更详细的解释:https://blog.lavrton.com/javascript-loops-how-to-handle-async-await-6252dd3c795

您还可以在那里找到修复方法。您可以使用 for-of 循​​环代替 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 方法,然后,执行完成后,word=love 会调用 find 方法,最后两个调用都完成后,res.send 将被调用。