Javascript 为什么。那么方法不会全局填充productList数组?
我正在使用node.js和express。使用管线时会出现问题。我已经创建了一个名为productList的数组,我想用json对象填充它,但我的代码不起作用。第一条console.log语句成功地记录了json对象的数组,但第二条console.log语句记录了空数组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
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)代码>将列表显示为空
产品.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
,然后将其传递给模板。