首页 > 解决方案 > 如何访问函数表达式nodejs中的变量

问题描述

有没有办法data在函数之外获取变量的内容。我被困住了,在stackoverflow中查看了各种论坛,但失败了。我正在尝试从猫鼬模型中检索数据并将这些结果推送到一个数组中results,当我打印results数组时,我得到空数组。

  var results = []
  Model.find({firstName:name}, function(err,data){       
     if(err)
       throw err;

     data.forEach(function(element) {
       console.log(element);
       results.push(element);
     });
 });
 console.log(results) --> []

但是当我尝试打印里面的数据ForEach时,我得到了下面列出的结果。

0 => { _id: 5dc9953a2168993711903698,
  id: 763,
  firstName: 'Deepak',
  lastName: 'Kalra',
  image_id: 'No',
  logged: false,
  __v: 0 
}
1 => { 
  _id: 5dc995546f0f88372080ea36,
  id: 511,
  firstName: 'Deepak',
  lastName: 'Kalra',
  image_id: 'No',
  logged: false,
  __v: 0 
}

整个代码

  alexa.intent("FirstName", {
     "slots": { "name": "AMAZON.FIRST_NAME" },
     "utterances": [
       "sure {-|name}","{-|name}","my name is {-|name}"
      ]
  },
  function(request, response) {
    var name = 'Deepak';
    try {
      var results = await Model.find({firstName:name});
      console.log(results)
    } catch (error) {
      // Handle error.
    }

   // Model.find({firstName:name}, function(err,data){

      //   if(err)
      //     throw err;
     //   data.forEach(function(element) {
    //     console.log(element);
    //     results.push(element);
     //   });
  // });

     console.log(results);
  });

有什么办法可以解决。请帮我

标签: javascriptnode.jsmongoose

解决方案


因为,console.log(results)之前执行Model.find完毕。

你可以在这里做两件事:

  • 放在console.log(results)回调里面。
  • 用于async/await获得类似的行为。

示例(回调):

Model.find({firstName:name}, function(err,data){       
    if(err)
      throw err;

    console.log(data); // data is already an array
});

示例(异步/等待):

try {
  var results = await Model.find({ firstName: name });  
  console.log(results)
} catch (error) {
  // Handle error.
}

Model.find已经返回了一个文档数组,因此您不必运行循环将它们推送到数组中。

更新

alexa.intent("FirstName", {
  "slots": { "name": "AMAZON.FIRST_NAME" },
  "utterances": [
    "sure {-|name}", "{-|name}", "my name is {-|name}"
  ]
},
async function (request, response) {
  var name = 'Deepak';
  try {
    var results = await Model.find({ firstName: name });
    console.log(results)
  } catch (error) {
    // Handle error.
  }
});

注意async函数前面的。


推荐阅读