javascript - 在 switch case 中出现错误时停止循环 - 在将 header 发送到客户端后无法设置 header

标签 javascript mysql

我想在 mysql 中执行多个插入语句,首先调用 1 个查询来检查结果是否为 null/no/empty,然后根据现有对象执行插入。我有 4 个与 user_session 表相关的不同表。我想根据收到的对象1×1插入。

但是当我收到查询错误时,我不知道如何停止循环。

在这种情况下,我有一个像这样的对象:

{"ua":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
"browser":{"name":"Chrome","version":"71.0.3578.98","major":"71"},
"engine":{"name":"WebKit","version":"537.36"},
"os":{"name":"Windows","version":"10"},
"device":{},
"cpu":{"architecture":"amd64"}}

但是当我尝试像这样插入时遇到问题:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

export const cookieTrack = (req, res) => {
     let queryInsertSession = `INSERT INTO user_session (id,ip_address) values ('${req.sessionID}','${ip_address}')`;
            let queryInsertSessionBrowserAndEngineOs = (table)=>{
                return `INSERTs INTO ${table} set session_id = (SELECT us.id from user_session as us where id = '${req.sessionID}' and us.ip_address = '${ip_address}'), ?   `;
            } 
            let queryInsertDevice = `INSERT INTO session_device set session_id = (SELECT us.id from user_session as us where id = '${req.sessionID}' and us.ip_address = '${ip_address}'), ?`

            db.query(queryInsertSession,(error,result)=>{
                let checkError = [];
                if(error) return res.status(400).json(error);
                if(result){
                    if (Object.keys(ua).length > 0) {

                        Object.keys(ua).forEach(key => {
                            switch (key) {
                                case 'browser':
                                    let session_browser = {};
                                    if (ua[key].hasOwnProperty('name')) {
                                        session_browser.name = ua[key].name;
                                    }
                                    if (ua[key].hasOwnProperty('version')) {
                                        session_browser.version = ua[key].version
                                    }
                                    if (Object.keys(session_browser).length > 0){
                                        db.query(queryInsertSessionBrowserAndEngineOs('session_browser'), session_browser, (error, result) => {
                                            if (error) return res.status(400).json(error);
                                        });
                                    }

                                    return;
                                case 'engine':
                                    let session_engine = {};
                                    if (ua[key].hasOwnProperty('name')) {
                                        session_engine.name = ua[key].name;
                                    }
                                    if (ua[key].hasOwnProperty('version')) {
                                        session_engine.version = ua[key].version
                                    }
                                    if (Object.keys(session_engine).length > 0){

                                        db.query(queryInsertSessionBrowserAndEngineOs('session_engine'), session_engine, (error, result) => {
                                            if (error) return res.status(400).json(error);
                                        });
                                    }

                                    return;
                                case 'os':
                                    let session_os = {};
                                    if (ua[key].hasOwnProperty('name')) {
                                        session_os.name = ua[key].name;
                                    }
                                    if (ua[key].hasOwnProperty('version')) {
                                        session_os.version = ua[key].version
                                    }

                                    if (Object.keys(session_os).length > 0){
                                        db.query(queryInsertSessionBrowserAndEngineOs('session_os'), session_os, (error, result) => {
                                            if (error) return res.status(400).json(error);
                                        });
                                    }

                                    return;
                                case 'device':
                                    let session_device = {};
                                    if (ua[key].hasOwnProperty('type') && typeof ua[key].type !== "undefined") {
                                            session_device.type = ua[key].type;
                                        }
                                    if (ua[key].hasOwnProperty('vendor') && typeof ua[key].type !== "undefined") {
                                            session_device.vendor = ua[key].vendor
                                        }
                                    if (ua[key].hasOwnProperty('model') && typeof ua[key].type !== "undefined") {
                                            session_device.model = ua[key].model
                                        }

                                    if (Object.keys(session_device).length > 0){
                                        db.query(queryInsertDevice, session_device, (error, result) => {
                                            if (error) return res.status(400).json(error);

                                        });
                                    }    
                                    return;


                                default:
                                    return;
                            }

                        });

                    }

                }
            })
}

在我看来,发生这种情况是因为当我遇到循环错误时它不会完全停止

最佳答案

循环不会停止,因为您正在使用 forEach。

当您执行此操作时,Object.keys(ua).forEach(key => { ... }) 您将迭代您的键并调用作为每个“键”上的参数提供的函数。

如果函数内有一个return,它将应用于函数而不是循环。我知道的唯一解决方案是抛出异常。另一种方法是有一个实际的循环:

let anArray = Object.keys(ua)
for (let i = 0 ; i < anArray.length ; ++i )
{
  ... code with return statements
}

关于javascript - 在 switch case 中出现错误时停止循环 - 在将 header 发送到客户端后无法设置 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54176149/

相关文章:

javascript - for 循环中的 Vue 插槽范围

需要多个输入为真的问题的 MySQL 数据结构

Python MySQL 返回错误的查询行,但 Phpmyadmin 显示正确的行

c# - 停止使用数据库的线程

javascript - 如何向 map 上的标记添加删除按钮

javascript - 无法通过使用输入属性

mysql - 执行 Mysql 查询,在某些位置屏蔽二进制字符串

MySQL:查询 UNION,JOIN 有条件的 WHERE

javascript - 从 asp.net 控件内的 Javascript 返回字符串

javascript - 如何在浏览器中查找javascript发生异常的行