在节点sqlite DB插入函数中使绑定或列索引超出范围

时间:2016-11-14 13:18:13

标签: sql node.js sqlite promise

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)
);

1 个答案:

答案 0 :(得分:1)

我通过使用db.exec()而不是db.run()解决了类似的问题。由于db.exec()不接受参数,因此我必须自己编写正确的sql查询字符串。