【问题标题】:node-sqlite insert fails on not-null constraint, but data are there?node-sqlite 插入在非空约束上失败,但数据在那里?
【发布时间】:2019-04-06 09:47:23
【问题描述】:

我的 nodejs 应用程序中有以下代码作为 expressjs 服务的一部分:

let db = sqlite.open(conf.database, { Promise }).then( (dba) => {
    P.all([dba.exec(accesslog_ddl),dba.exec(tokens_ddl)]).then(()=>{
        console.log("Database initialized ...");
    });
    return dba;
});

let upsertToken = function (token, expire, customer) {
    return db.then(d=>{
        console.log(`${token}, ${expire}, ${customer}`);
        return d.exec("insert into tokens (tokenid, name, email, cell, expire) values (?,?,'none','none','never')",
            [token,expire]);
    });
};

// ... expressjs setup ...

router.post('/tokens',(req,res) => {
    tokens.addToken(req.body.token, req.body.expires, req.body.name)
    .then(() => {res.status(201).send()})
    .catch((e) => {res.status(500).send(e)});
});

日志中的输出如下:

bluhbleh, never, fred flintstone
{ [Error: SQLITE_CONSTRAINT: NOT NULL constraint failed: tokens.name] errno: 19, code: 'SQLITE_CONSTRAINT' }
POST /services/tokens 500 20.287 ms - 2

这证明tokenexpirecustomer都存在于exec()调用之前,但由于NOT NULL约束失败,调用失败。

关于这段代码的一些奇怪的事情:

  1. 我正在使用承诺的node-sqlite package
  2. 我正在使用承诺的expressjs router
  3. 我对 promises(以及一般的 nodejs)真的很陌生,而且可能做的不对。

我的完整代码在这里: https://bitbucket.org/highaltitudearchery/locker/src/master/

【问题讨论】:

    标签: node.js sqlite express promise


    【解决方案1】:

    你用错了execpromisified 版本的 Database#exec 只接受一个参数,即要执行的 SQL。

    【讨论】:

    • 天啊!错过了。奇怪的是 exec 不允许参数化的 sql。切换到.run(),现在工作得更好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多