我想在 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/