将变量设置为函数,在使用变量后执行功能

时间:2019-09-08 13:40:48

标签: javascript express ejs

我正在使用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()

的末尾执行

1 个答案:

答案 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;
  }