Node仍然有点新鲜,但这让我疯狂。我环顾四周,但找不到一个对我有帮助的现有答案。我知道我确实错过了一些愚蠢的东西。我的元素似乎正确映射。我有三重检查我的列和我的价值观。我甚至从Visual Studio代码中的调试会话中获取了SQL查询,并直接在DBVis中运行它,没有任何问题。但由于某种原因,当我在Node中运行它时,我总是得到"错误:SQLITE_RANGE:绑定或列索引超出范围"。在节点和SQLite中有映射元素是否有任何已知问题我不熟悉??我在其他地方使用map函数和sql函数,它似乎工作正常。只是不在这里
这是相关代码。
exports.createUserGoogle = createUserGoogle;
function createUserGoogle(jsonObj, cb) {
var sql = "Begin;"
+"Insert into userGoogle (googleId,token,name,email,photoid) values ($googleid,$googleToken,$name,$email,$photoid);"
+"Commit;";
doSQL(sql, mapDataElements(jsonObj), cb);
}
我的映射功能
function mapDataElements(jsonObj) {
dataObj = {};
for (key in jsonObj) {
dataObj['$' + key] = jsonObj[key];
}
console.log('mapDataElements: Mapped as: ' + JSON.stringify(dataObj));
return dataObj;
}
我的标准SQL承诺功能
function doSQL(sqlStr, bindings, cb) {
var p = new Promise((resolve, reject) => {
db.serialize(() => {
db.run(sqlStr, bindings, (err) => {
if (err) {
console.log('SQL failed: ' + JSON.stringify(bindings));
reject(err);
}
else {
console.log('SQL succeeded: ' + sqlStr);
resolve();
}
});
});
});
p.then(
(data) => {
console.log('Doing callback');
cb('success');
},
(err) => {
cb(null, err);
}
);
}
这也是我的映射元素的样子(为安全起见略微编辑):
mapDataElements: Mapped as: {"$googleid":"mylongnumber","$googleToken":"myreallylongtokenvalue","$name":"My name","$email":"my.email@gmail.com","$photoid":1}
任何我的表,如果它有帮助
CREATE TABLE userGoogle(
pk_google INTEGER NOT NULL PRIMARY KEY,
googleId TEXT,
token TEXT,
name TEXT,
email TEXT,
photoid int,
FOREIGN Key(photoid) References photo(pk_photo)
);
答案 0 :(得分:1)
我通过使用db.exec()
而不是db.run()
解决了类似的问题。由于db.exec()
不接受参数,因此我必须自己编写正确的sql查询字符串。