Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从控制器中的循环返回错误?_Sql_Node.js - Fatal编程技术网

Sql 如何从控制器中的循环返回错误?

Sql 如何从控制器中的循环返回错误?,sql,node.js,Sql,Node.js,我展示了SQL结构、试图插入的数据和代码。然后我揭露了问题 这是一个简单的电子商务项目。问题与订单创建(POST)有关 SQL结构: 数据JSON格式: { "user": { "email": "test@test.com", "role": "administrator", "userId": 63 },

我展示了SQL结构、试图插入的数据和代码。然后我揭露了问题

这是一个简单的电子商务项目。问题与订单创建(POST)有关

SQL结构:

数据JSON格式:

{
    "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{]