Javascript 为app.POST server创建多个SQL语句查询
我目前一直在尝试在server.js中的app.post函数上运行多个insert SQL语句。这是一个视频游戏数据库。 首先,我尝试了被注释掉的方法,但在尝试插入新游戏时,会收到一个错误,说“列索引超出范围”。因此,我尝试了未注释的函数,看看是否可以一次执行一个,但我现在收到的错误是“发送到客户端后无法设置头” “this.all”调用此函数Javascript 为app.POST server创建多个SQL语句查询,javascript,mysql,node.js,Javascript,Mysql,Node.js,我目前一直在尝试在server.js中的app.post函数上运行多个insert SQL语句。这是一个视频游戏数据库。 首先,我尝试了被注释掉的方法,但在尝试插入新游戏时,会收到一个错误,说“列索引超出范围”。因此,我尝试了未注释的函数,看看是否可以一次执行一个,但我现在收到的错误是“发送到客户端后无法设置头” “this.all”调用此函数 //database.js class DB{ constructor(){ this.db = new sqlite3.Da
//database.js
class DB{
constructor(){
this.db = new sqlite3.Database(DBSOURCE, (err) => {
if(err){ //callback
// Cannot open Database
console.error(err.message)
throw err
}else{
console.log('Connnected to the SQLite database.')
}
})
}
all(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.all(sql, params, (err, rows) => {
if(err){
console.log('Error running sql: ' + sql)
console.log(err)
reject(err)
} else{
resolve(rows)
}
})
})
}
...
}
为了澄清一下,我从HTML表单数据部分获取了所有数据,然后将其设置为您在这里看到的“data.publisher,data.developer,…”所以我想我找到了答案。我一直得到“发送到客户机后无法设置头”的原因是我在每次函数调用后都尝试res.json。我为此做的修复是删除所有带有res.json的.then语句,并将其仅移动到最后一个函数。json基本上是请求调用的一个finishing语句,这就是发送头的原因,之后就不能再发送了。以下是有效的解决方案
videogames.insertNewGame(data.gameTitle, data.year, data.genre)
.catch(err => {
res.status(400).json({"error":err.message})
})
videogames.updateNewGame(data.gameTitle, data.platformCB)
.catch(err => {
res.status(400).json({"error":err.message})
})
videogames.insertPublisher(data.publisher)
.catch(err => {
res.status(400).json({"error":err.message})
})
videogames.insertDeveloper(data.developer)
.catch(err => {
res.status(400).json({"error":err.message})
})
videogames.insertContract(data.gameTitle, data.publisher, data.developer)
.then(() => {
res.json({
"message":`Success! inserted new game`,
"data":data.gameTitle
})
})
.catch(err => {
res.status(400).json({"error":err.message})
})
请添加代码片段而不是屏幕截图链接。我不能这样做,因为我是一个新用户,堆栈溢出需要一定数量的信誉点。在这种情况下,我认为,至少新用户可以添加代码示例。你说得对,这是更新版本。你想使用的第一个函数没有问题。通常,错误
列超出范围
意味着您试图插入到一个不存在的列中(即,您有一个输入错误,因为您无意中引用了另一个表)。另外,显然,您需要使用新的INSERT查询更新videogames.insertNewGame()
函数,并接受要传递给它的所有参数。
//database.js
class DB{
constructor(){
this.db = new sqlite3.Database(DBSOURCE, (err) => {
if(err){ //callback
// Cannot open Database
console.error(err.message)
throw err
}else{
console.log('Connnected to the SQLite database.')
}
})
}
all(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.all(sql, params, (err, rows) => {
if(err){
console.log('Error running sql: ' + sql)
console.log(err)
reject(err)
} else{
resolve(rows)
}
})
})
}
...
}
videogames.insertNewGame(data.gameTitle, data.year, data.genre)
.catch(err => {
res.status(400).json({"error":err.message})
})
videogames.updateNewGame(data.gameTitle, data.platformCB)
.catch(err => {
res.status(400).json({"error":err.message})
})
videogames.insertPublisher(data.publisher)
.catch(err => {
res.status(400).json({"error":err.message})
})
videogames.insertDeveloper(data.developer)
.catch(err => {
res.status(400).json({"error":err.message})
})
videogames.insertContract(data.gameTitle, data.publisher, data.developer)
.then(() => {
res.json({
"message":`Success! inserted new game`,
"data":data.gameTitle
})
})
.catch(err => {
res.status(400).json({"error":err.message})
})