Node.js和sqlite,SQLITE_RANGE:绑定或列索引超出范围

看到我的答案下面的MWE!

我知道这听起来很愚蠢,答案可能是在我面前,但我不明白为什么我得到这个SQLITE_RANGE错误,因为我的对象看起来像它有每个属性需要。

console.log "values " , values # Recording in db console.assert values.login? console.assert values.password_sha? console.assert values.email? console.assert values.token? values.password = null @db.run "INSERT INTO user VALUES (NULL, $login, $password_sha, $email, $token)", values, (err) -> console.error err if err? 

这是我的服务器的输出

 values { login: 'ostream', email: 'ijw', password: 'justine', token: 'acppn99ngiafw29', password_sha: 'b1820c2ec34175954bdaa42038b48886b4c83f8d53f88b5315c415898855e4f8' } { [Error: SQLITE_RANGE: bind or column index out of range] errno: 25, code: 'SQLITE_RANGE' } 

提前致谢!

INSERT时应始终指定列列表:

 INSERT INTO "user"(login, password_sha, email, token) VALUES ('ostream', 'b1820c2ec34175954bdaa42038b48886b4c83f8d53f88b5315c415898855e4f8', 'ijw', 'acppn99ngiafw29'); SELECT * FROM "user" 

SqlFiddleDemo

请记住, user是关键字,应引用"或者你可以重命名表给users

显然你需要做的是确保你的user对象中的键前缀为$ 。 否则, sqlite3将不会将它们识别为占位符的值。 尝试:

 sqlite3 = require 'sqlite3' db = new sqlite3.Database('testfile.db'); user = $name: 'hello' $password: 'jambon' db.run 'insert into "user" (name, password) VALUES ($name, $password)', user, (err) -> console.log 'request executed : ', err 

这不是很好的文档,但看看testing案例,你可以看到有其他的select,比如用@或者:前缀。 在任何情况下,你的对象必须匹配占位符,包括前缀。

我试图做一个testing,我得到了同样的错误:

 sqlite3 = require 'sqlite3' db = new sqlite3.Database('testfile.db'); user = name: 'hello' password: 'jambon' db.run 'insert into "user" (name, password) VALUES ($name, $password)', user, (err) -> console.log 'request executed : ', err 

服务器答案:

 request executed : { [Error: SQLITE_RANGE: bind or column index out of range] errno: 25, code: 'SQLITE_RANGE' } 

怎么来的?