Sql 如何从控制器中的循环返回错误?
我展示了SQL结构、试图插入的数据和代码。然后我揭露了问题 这是一个简单的电子商务项目。问题与订单创建(POST)有关 SQL结构: 数据JSON格式:Sql 如何从控制器中的循环返回错误?,sql,node.js,Sql,Node.js,我展示了SQL结构、试图插入的数据和代码。然后我揭露了问题 这是一个简单的电子商务项目。问题与订单创建(POST)有关 SQL结构: 数据JSON格式: { "user": { "email": "test@test.com", "role": "administrator", "userId": 63 },
{
"user": {
"email": "test@test.com",
"role": "administrator",
"userId": 63
},
"items": [
{
"added": 2,
"id": 6,
"name": "Le Classique",
"price": 5
},
{
"added": 5,
"id": 2,
"name": "Le Classique",
"price": 5
}
]
}
NodeJS控制器功能:
exports.create = async (req, res, next) => {
const formData = req.body
const newOrder = {
user_id: formData.user.userId,
date: new Date()
}
const newOrderItems = formData.items
try {
await db.query(
"INSERT INTO orders SET ?", newOrder, (err, results) => {
if (err) {
res.status(500).send("Erreur d'écriture des données")
} else {
newOrder.id = results.insertId
for (let i = 0; i < newOrderItems.length; i++) {
let orderItems = {
orders_id: newOrder.id,
items_id: newOrderItems[i].id,
quantity: newOrderItems[i].added
}
db.query(
"INSERT INTO order_items SET ?", orderItems, (err, results) => {
if (err) {
// throw an error? and cancel everything?
}
}
)
}
res.status(201).send({
order: newOrder
})
}
})
} catch (err) {
return next(err)
}
}
您可以添加临时数组,以便在添加项时维护来自SQL的错误,在循环之后,您可以检查数组的长度以发送响应。因为您正在使用回调,所以我们必须维护一个单独的计数器来检查是否所有请求都返回 下面是示例代码
exports.create = async (req, res, next) => {
const formData = req.body
const newOrder = {
user_id: formData.user.userId,
date: new Date()
}
const newOrderItems = formData.items
try {
await db.query(
"INSERT INTO orders SET ?", newOrder, (err, results) => {
if (err) {
return res.status(500).send("Erreur d'écriture des données")
}
newOrder.id = results.insertId
const errData = [];
let queryCounter = 0;
for (let i = 0; i < newOrderItems.length; i++) {
let orderItems = {
orders_id: newOrder.id,
items_id: newOrderItems[i].id,
quantity: newOrderItems[i].added
}
db.query(
"INSERT INTO order_items SET ?", orderItems, (err, results) => {
// keeping track of records tried
queryCounter++;
if (err) {
errData.push(err);
}
// check if all callback came back
if (queryCounter === newOrderItems.length) {
if (errData.length) {
return res.status(500).send({
message: 'Failed to insert items',
errors: errItems
});
}
return res.status(201).send({
order: newOrder
});
}
}
)
}
})
} catch (err) {
return next(err)
}
exports.create=async(请求、恢复、下一步)=>{
const formData=req.body
常数newOrder={
用户标识:formData.user.userId,
日期:新日期()
}
const newOrderItems=formData.items
试一试{
等待db.query(
“是否插入订单集?”,新订单,(错误,结果)=>{
如果(错误){
返回res.status(500)。发送(“错误标准”)
}
newOrder.id=results.insertId
常量errData=[];
设queryCounter=0;
for(设i=0;i{
//记录
queryCounter++;
如果(错误){
errData.push(err);
}
//检查是否所有回调都返回
if(queryCounter==newOrderItems.length){
if(errData.length){
返回资源状态(500)。发送({
消息:“插入项目失败”,
错误:errItems
});
}
返回资源状态(201)。发送({
订单:新订单
});
}
}
)
}
})
}捕捉(错误){
返回下一个(错误)
}
}
建议:改用承诺而不是使用回调,这样会出现棘手的情况。您可以添加临时数组,以便在添加项时维护来自SQL的错误,在循环之后,您可以检查数组的长度以发送响应。因为您正在使用回调,所以我们必须维护一个单独的计数器来检查是否所有请求都返回 下面是示例代码
exports.create = async (req, res, next) => {
const formData = req.body
const newOrder = {
user_id: formData.user.userId,
date: new Date()
}
const newOrderItems = formData.items
try {
await db.query(
"INSERT INTO orders SET ?", newOrder, (err, results) => {
if (err) {
return res.status(500).send("Erreur d'écriture des données")
}
newOrder.id = results.insertId
const errData = [];
let queryCounter = 0;
for (let i = 0; i < newOrderItems.length; i++) {
let orderItems = {
orders_id: newOrder.id,
items_id: newOrderItems[i].id,
quantity: newOrderItems[i].added
}
db.query(
"INSERT INTO order_items SET ?", orderItems, (err, results) => {
// keeping track of records tried
queryCounter++;
if (err) {
errData.push(err);
}
// check if all callback came back
if (queryCounter === newOrderItems.length) {
if (errData.length) {
return res.status(500).send({
message: 'Failed to insert items',
errors: errItems
});
}
return res.status(201).send({
order: newOrder
});
}
}
)
}
})
} catch (err) {
return next(err)
}
exports.create=async(请求、恢复、下一步)=>{
const formData=req.body
常数newOrder={
用户标识:formData.user.userId,
日期:新日期()
}
const newOrderItems=formData.items
试一试{
等待db.query(
“是否插入订单集?”,新订单,(错误,结果)=>{
如果(错误){
返回res.status(500)。发送(“错误标准”)
}
newOrder.id=results.insertId
常量errData=[];
设queryCounter=0;
for(设i=0;i{
//记录
queryCounter++;
如果(错误){
errData.push(err);
}
//检查是否所有回调都返回
if(queryCounter==newOrderItems.length){
if(errData.length){
返回资源状态(500)。发送({
消息:“插入项目失败”,
错误:errItems
});
}
返回资源状态(201)。发送({
订单:新订单
});
}
}
)
}
})
}捕捉(错误){
返回下一个(错误)
}
}
建议:改用承诺而不是回电,这样会出现棘手的情况。你好,我想你有个好主意;但有点不对劲。我尝试了你的代码,它不等待有一个错误之前结束循环。。。所以errItems数组对他来说总是空的(在IF条件下)是的,只是注意到你的插入代码在回调中,理想情况下,你的成功响应也不需要检查,所以我们可以将返回语句添加到回调中,我刚才在res.status(201)周围添加了其他{)。但是仍然不知道如何输入错误(500)如果有一个(或多个),则添加ArrayTanks中出现错误,但现在results.insertId未定义。我想我无法接收insertId。如果我在console中记录结果,我就没有它。在执行console.logHello时,你在结果中得到了什么。我想你有一个好主意;但有些地方出了问题。我尝试了你的代码,它不会等到出现错误后再结束循环。。。所以errItems数组对他来说总是空的(在IF条件下)是的,只是注意到你的插入代码在回调中,理想情况下,你的成功响应也不需要检查,所以我们可以将返回语句添加到回调中,我刚才在res.status(201)周围添加了else{]