我正在使用express处理一些路线和视图(ejs
模板)。
这是我下订单的路线:
router.get('/orders/all', admin_check, (req, res) => {
const orders = getOrders()
console.log('----- orders got from function : ')
console.log(orders)
res.render(process.cwd() + '/src/views/admin/orders/all_orders', {
orders: orders,
test: 1
})
})
如您所见,我正在传递订单并进行测试。订单的值为getOrders()
,这是getOrders()
函数。
export const getOrders = () => {
Order.find({}, (err, orders) => {
let ordersMap = {}
orders.forEach(order => {
ordersMap[order._id] = order
})
console.log('returning orders from function:')
console.log(ordersMap)
return ordersMap
})
}
所以这里的问题是,执行此操作时,它应该将返回的值从getOrders()
传递到我的ejs
模板中,但返回的是undefined。
因此,正如您所看到的,我添加了console.log()
,在那里我了解了发生了什么。
路由器中的2 console.log()
在console.log()
中的getOrders()
之前执行。因此,这意味着在分配值之前先使用变量orders
。
为了更好地理解,orders
中的res.render()
的值为undefined
。这是因为函数getOrders()
仅在该router
的末尾运行
我可以做任何想要的操作,getOrders()
函数只会在该router.get()
答案 0 :(得分:0)
好的。因此,这里的问题是您没有等待getOrders()
返回响应并继续进行。这是Node.js中的标准异步处理方式。
因此,要解决此问题,您可以使用回调函数调用getOrders()
并在该回调函数中执行操作,或者使用async / await并保持函数的结构不变,如现在。
要使用async / await修复它,这就是您的方法
router.get('/orders/all', async (req, res) => {
const orders = await getOrders()
console.log('----- orders got from function : ')
console.log(orders)
res.render(process.cwd() + '/src/views/admin/orders/all_orders', {
orders: orders,
test: 1
})
});
并像这样修改getOrders函数-
export const getOrders = async () => {
let orders = await Order.find({});
let ordersMap = {}
orders.forEach(order => {
ordersMap[order._id] = order
})
console.log('returning orders from function:')
console.log(ordersMap)
return ordersMap;
}