如何在 Express.js 中获取 res json 值

How to get res json value in Express.js

我是 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 - 此方法创建购物车和 return 我通过 res.json

returning 的代码
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 中打印购物车代码,但它没有打印任何内容并抛出异常。

首先,您尝试调用一个 returns 和 Promise 的函数,它是异步的,并期望它的行为就像是同步的,这是行不通的:

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

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

如果你想像现在一样使用 getCartCode,你必须使用类似 async/await 的东西,像这样:

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
    })
}

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

以下是您必须如何处理此问题:

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
    })
}

res 是写流。所以 res.jsonres.send 将终止流和 return 对客户端的响应。您只想从 getCardCode 函数中 return JSON。所以不必将 res 发送到 getCardCode 只需 return 控制器中的 Promiseawait 即可。

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.
});

这里只是 return JSON:

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

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