如何在Nodejs中使用函数外部对象

hfwmuf9z  于 2023-03-08  发布在  Node.js
关注(0)|答案(2)|浏览(126)

我使用的是NodeJ,为什么我无法获取dataincollection变量的值这里我使用的是Nedb

router.get('/', (req, res) => {
    var collection = [];
    db.find({}, function (err, data) {
        collection = data
    });
    res.render('../views/Client/index.ejs', { data: collection })
    console.log(collection)
});

我还尝试var集合=nullvar集合;但它仍然没有显示数据。我已经尝试了所有这些,但这些仍然有问题。Get node.js neDB data into a variable

58wvjzkj

58wvjzkj1#

考虑一下router.get()函数的操作方式。目前,您同步编写了它。因此,它将执行db.find(),然后立即运行res.render(),而不等待回调函数传入db.find()。因此,data将是未定义的,您将不会得到预期的结果。
你需要把它作为一个异步操作来运行,我个人倾向于使用try/catch,但是你也可以读取asynchronous JS here,这将允许db.find()内部的回调函数完成它的数据返回。
下面是一个示例(可能不是工作代码,可以将其视为伪代码):

router.get('/', async (req, res) => {
   try {
      var collection = [];
      await db.find({}, function (err, data) {
         collection = data
      });
      console.log(collection)
      res.render('../views/Client/index.ejs', { data: collection })
    } catch (err) {
      console.error(err)
    }
});

这里,我们告诉函数在运行下一行res.render()之前等待db.find()完成它的执行。同样,这是未经测试的伪代码,所以不要假设复制/粘贴它会起作用。花点时间学习异步函数。

8zzbczxx

8zzbczxx2#

因为回调不是在res.render(...)之前触发的。它类似于异步操作。回调函数可以在数据库完成后工作以查找数据。您可以尝试在回调函数中使用res.render(...)

相关问题