TypeError:命名参数只能在普通对象中传递,同时尝试使用 ES6 箭头函数处理 Sqlite 错误

问题描述 投票:0回答:1

我有一些工作代码来操作用这种表示法编写的 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
块。我找到了一些示例(herehere),但它们使用不同的语法,其中 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()
语法并使用我链接的网页中的示例吗?

javascript sqlite ecmascript-6 node-sqlite3
1个回答
0
投票

您链接的示例使用包

sqlite3
,但我从您的代码中猜测您正在使用
better-sqlite3
,因为它与他们的文档更相似。

better-sqlite3
不提供将错误函数作为
PreparedStatement.run
的第二个参数的 API。

相反,它会尝试使用您的错误函数作为命名参数。函数不是普通对象,这解释了您的错误。

© www.soinside.com 2019 - 2024. All rights reserved.