我的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
这证明token
、expire
和 customer
在exec()
调用之前都存在,但由于 NOT NULL 约束失败,调用失败。
关于这段代码的一些奇怪之处:
- 我正在使用有前途的节点 sqlite 包。
- 我正在使用一个有前途的 expressjs 路由器。
- 我真的是承诺(和一般的nodejs(的新手,并且可能没有做正确的事情。
我的完整代码在这里:https://bitbucket.org/highaltitudearchery/locker/src/master/
你用错exec
。 Database#exec 的 promisized 版本只需要一个参数,即要执行的 SQL。