如何在 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.json
或 res.send
将终止流和 return 对客户端的响应。您只想从 getCardCode
函数中 return JSON。所以不必将 res
发送到 getCardCode
只需 return 控制器中的 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.
});
这里只是 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
变量添加空检查。
我是 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.json
或 res.send
将终止流和 return 对客户端的响应。您只想从 getCardCode
函数中 return JSON。所以不必将 res
发送到 getCardCode
只需 return 控制器中的 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.
});
这里只是 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
变量添加空检查。