0

我是 node.js 的新手。我正在尝试做这样的事情-

我创建了一个添加到购物车 API,我首先检查会话购物车是否存在。如果不存在,我正在通过getCartCode(res)方法创建新购物车。

app.post('/addToCart', function(req, res) {
console.log('[POST] /addToCart');

var cart = req.body.conversation.memory['cart'];

if(!cart) {
   const response = getCartCode(res);
   console.log("******* Result ************ : " + response.conversation.memory['cart']); // Giving undefined exception here
}
}

getCartCode - 此方法创建购物车并返回我通过 res.json 返回的代码

function getCartCode(res)  {

return createCart()
  .then(function(result) {
    res.json({
      conversation: {
        memory: {
          'cart': result,
        }
      }
    });

    return result;
  })
  .catch(function(err) {
    console.error('productApi::createCart error: ', err);
  });
 }

现在我想要的是,我想在 addToCart API 中获取购物车代码作为响应。我正在尝试在 console.log 中打印购物车代码,但它没有打印任何内容并引发异常。

4

2 回答 2

1

res是一个写流。所以res.jsonorres.send将终止流并将响应返回给客户端。您只想从getCardCode函数中返回 JSON。所以不必发送res只是在控制器中getCardCode返回Promise和它。await

app.post('/addToCart', async function (req, res) {
  console.log('[POST] /addToCart');

  var cart = req.body.conversation.memory['cart'];
  let response = {}
  if (!cart) {
    response = await getCartCode();
    console.log("******* Result ************ : " + response.conversation.memory['cart']); // Giving undefined exception here
  }
  res.json(response); // terminating the writestream with the response.
});

这里只返回 JSON:

function getCartCode() {
  return createCart()
    .then(function (result) {
      return {
        conversation: {
          memory: {
            'cart': result,
          }
        }
      };
    })
    .catch(function (err) {
      console.error('productApi::createCart error: ', err);
    });
}

注意:如果createCart返回错误,则response.conversation.memory['cart']此行将引发找不到未定义异常的对话。所以你需要在catch块中处理它。response要么抛出异常,要么返回 JSON,或者你可以为变量添加一个空检查。

于 2020-05-09T18:54:58.303 回答
1

首先,您试图调用一个返回 a 的函数Promise,它是异步的,并期望它表现得好像它是同步的,但这是行不通的:

// this won't work
const response = getCartCode(res)

function getCartCode(res) {
  return createCart().then(function(result) {
    return {...}
  });
}

async/await如果您希望能够使用类似于getCartCode您现在正在做的事情,您必须使用类似的东西,如下所示:

app.post('/addToCart', function(req, res) {
  async function handleAddToCart() {
    // i suggest you use something like the `lodash.get`
    // function to safely access `conversation.memory.cart`
    // if one of these attributes is `undefined`, your `/addToCart`
    // controller will throw an error
    const cart = req.body.conversation.memory.cart

    // or, using `lodash.get`
    // const cart = _.get(req, 'body.conversation.memory.cart', null)

    if (!cart) {
      const response = await getCartCode().catch(err => err)
      // do whatever you need to do, or just end the response
      // and also make sure you check if `response` is an error
      res.status(200).json(response)
      return
    }
    // don't forget to handle the `else` case so that your
    // request is not hanging
    res.status(...).json(...)
  }
  handleAddToCart()
})

function getCartCode() {
  return createCart()
    .then(function(result) {
      return { conversation: { memory: { cart: result } } }
    })
    .catch(function(err) {
      console.error('productApi::createCart error:', err);
      throw err
    })
}

其次,不要传递rescreateCart函数。相反,从createCart函数中获取您需要的数据并在控制器res.json内部调用。/addToCart

以下是您必须处理的方法:

app.post('/addToCart', function(req, res) {
  const cart = req.body.conversation.memory.cart

  if (!cart) {
    getCartCode()
      .then(function (result) {
        res.json(result)
      })    
      .catch(/* handle errors appropriately */)
     return;
  }
  // return whatever is appropriate in the `else` case
  res.status(...).json(...);
})

function getCartCode() {
  return createCart()
    .then(function(result) {
      return { conversation: { memory: { cart: result } } }
    })
    .catch(function(err) {
      console.error('productApi::createCart error:', err);
      throw err
    })
}
于 2020-05-09T18:48:03.230 回答