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

时间:2018-06-30 15:10:56

标签: arrays node.js express router

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

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 个答案:

答案 0 :(得分:0)

因为您在此处执行了一些异步操作,但是您将值同步发送。基本上,此代码将按以下顺序运行:

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

您可以在此处找到更详细的说明: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方法,最后两次调用完成后,{{ 1}}。