我有一些工作代码来操作用这种表示法编写的 Sqlite 数据库(我认为是 ES5?):
try {
const cols = Object.keys(data).join(", ");
const placeholders = Object.keys(data).map(x => "$" + x).join(", ");
const stmt = db.prepare(`
INSERT INTO ` + table + ` (` + cols + `)
VALUES (` + placeholders + `)`);
stmt.run(data);
} catch (err) {
// some reporting and handling
}
填充 SQL 语句的值来自之前传递的 JS 对象 (
data
)。
我想重构它以使用 ES6 并用箭头函数替换
try...catch
块。我找到了一些示例(here 和 here),但它们使用不同的语法,其中 SQL 命令直接使用 .run()
方法执行,而不是像我在代码中那样使用 .prepare()
。
但是,当我尝试将箭头函数直接应用于我的代码时
const cols = Object.keys(data).join(", ");
const placeholders = Object.keys(data).map(x => "$" + x).join(", ");
const insert_stmt = db.prepare(`
INSERT INTO ` + table + ` (` + cols + `)
VALUES (` + placeholders + `)`);
insert_stmt.run(data, (err) => {
if (err.message === "some error") {
// handle the error
}
});
我收到错误
类型错误:命名参数只能在普通对象中传递
据我所知,这可能是一个语法错误?我认为这意味着使用新的符号我没有正确传递
data
对象中的值。
在这种情况下,最佳做法是什么?我应该放弃
.prepare()
语法并使用我链接的网页中的示例吗?
您链接的示例使用包
sqlite3
,但我从您的代码中猜测您正在使用better-sqlite3
,因为它与他们的文档更相似。
better-sqlite3
不提供将错误函数作为 PreparedStatement.run
的第二个参数的 API。
相反,它会尝试使用您的错误函数作为命名参数。函数不是普通对象,这解释了您的错误。