Javascript 为什么。那么方法不会全局填充productList数组?

Javascript 为什么。那么方法不会全局填充productList数组?,javascript,node.js,express,Javascript,Node.js,Express,我正在使用node.js和express。使用管线时会出现问题。我已经创建了一个名为productList的数组,我想用json对象填充它,但我的代码不起作用。第一条console.log语句成功地记录了json对象的数组,但第二条console.log语句记录了空数组 router.get('/', (req, res) => { var productList = [] ; Products.find() .then(products => { product

我正在使用node.js和express。使用管线时会出现问题。我已经创建了一个名为productList的数组,我想用json对象填充它,但我的代码不起作用。第一条console.log语句成功地记录了json对象的数组,但第二条console.log语句记录了空数组

router.get('/', (req, res) => {
  var productList = [] ;
  Products.find()
  .then(products => {
    products.forEach(product => {
    productList.push(product) ;
    console.log(productList) ; // First console.log
   })
  })
  .catch(err => res.status(400).json({'error': "Something wrong happened !!"}));

  console.log(productList) ;  // Second console.log
  res.render("products", {productList}) ;
});

此处Products是成功创建的文档的名称。我认为问题与productList数组的作用域有关。我不明白这里发生了什么事。请帮忙

在填充is之前,您正在尝试使用
productList
。Javascript中的异步操作,如
Products.find()
是异步和非阻塞的。这意味着它们开始运行,然后代码继续运行,一段时间后,调用
.then()
处理程序

因此,代码中的操作顺序是:

  • 声明
    var productList=[]
  • 调用刚刚开始操作的
    Products.find()
  • 执行第二个
    console.log(productList)将列表显示为空
  • 调用res.render(“产品”{productList})
  • 然后,稍后,调用
    产品.find()
    .Then()
    处理程序
  • 从排序中可以看出,您正在尝试将
    productList
    res.render()

    这里通常的解决方案是将
    res.render()
    放在
    处理程序中。然后()
    处理程序,因为这是您代码中唯一知道正确填写
    productList
    的时间的地方,如下所示:

    router.get('/', (req, res) => {
      Products.find().then(productList => {
          console.log(productList);
          res.render("products", {productList}) ;
      }).catch(err => res.status(400).json({'error': "Something wrong happened !!"}));
    });
    
    注意,您似乎不再需要将
    产品
    复制到新的
    产品列表
    变量,因此我删除了该额外步骤


    仅供参考,您的
    .catch()
    处理程序可能会发送一个5xx状态,这通常是发生数据库错误时使用的状态。

    它确实会填充它,您只是检查得太早了。谢谢@jfriend00。我的疑问显而易见。如果在某些情况下我必须首先填充productList数组,然后将其传递给我的模板,该怎么办。我该怎么做?@Mohd.Shoaib-我不明白。这正是我答案中的代码所做的。它获取
    productList
    ,然后将其传递给模板。