вставка узла-sqlite завершается с ошибкой при ненулевом ограничении, но данные есть? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть следующий код в моем приложении 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.

Несколько странных вещей об этом коде:

  1. Я использую обещанный пакет node-sqlite .
  2. Я использую обещанный expressjs router .
  3. Я действительно новичок в обещаниях (и вообще в nodejs) и, вероятно, что-то не так делаю.

Мой полный код здесь: https://bitbucket.org/highaltitudearchery/locker/src/master/

1 Ответ

2 голосов
/ 06 апреля 2019

Вы используете exec неправильно. обещанная версия База данных # exec принимает только один аргумент - SQL для выполнения.

...