Knex транзакция, ожидающая затем - PullRequest
0 голосов
/ 26 апреля 2018

У меня проблема, когда транзакция knex ожидает затем.В приведенном ниже коде, как только произошел откат вместо того, чтобы перехватить эту ошибку, почтальон зависает в ожидании ответа.Похоже, он ожидает тогда.Это почему?Это будет означать, что даже если произошел откат, транзакция считает, что она успешна?

app.post('/register', (req, res) => {
    const { email, name, password } = req.body;
    const hash = bcrypt.hashSync(password, saltRounds);
    console.log(hash);
    //insert syntax
    //When sending back response on an error from a server never send information back as error, instead send just a message
    dbConnection.transaction((trx) => {
        trx.insert({
            name: name,
            emailaddress: email,
            createddt: new Date()
        }).into('users')
        .returning('emailaddress')
        .then((response) => {
            console.log(response);
            dbConnection('login').insert({
            emailaddress: response,
            password: hash
            })
            .then(res.json('user created'));
        })
        .then(() => {
            trx.commit;
            console.log('committed');
        })
        .catch(() => {
            trx.rollback;
            //console.log(err);
            console.log('rollback');

            //res.json('cannot create user');
        })
        //.catch((err) => res.status(400).json(err))
    })
    //.then(res.json('user created'))
    .catch((err) => res.status(400).json('cannot create user'))
})

Есть идеи, как это можно исправить?

1 Ответ

0 голосов
/ 26 апреля 2018

Вы не возвращаете обещания в своем коде должным образом, и вы даже не вызываете функции отката и фиксации.

Примерно так будет работать лучше:

    dbConnection.transaction((trx) => {
        return trx.insert({
            name: name,
            emailaddress: email,
            createddt: new Date()
        }).into('users')
        .returning('emailaddress')
        .then((response) => {
            console.log(response);
            return dbConnection('login').insert({
            emailaddress: response,
            password: hash
            });
        })
    })
    .then((result) => res.json('user created'))
    .catch((err) => res.status(400).json('cannot create user'));
...