【发布时间】:2019-09-18 15:02:13
【问题描述】:
我正在为我的数据库使用 knex.js,并且我有一个依赖于前一个查询的查询。
例子:
用户表
|用户名(pk) |名字 |姓氏 |
登录表
|用户名(pk/fk) |哈希 |
过程是:
插入用户>插入登录
登录依赖于用户,所以如果插入到用户还没有完成,它会返回一个错误。
这是我的代码:
const handleSignup = (req, res, db, logger, bcrypt) => {
const {
username,
password,
firstName,
lastName,
} = req.body;
const hash = bcrypt.hashSync(password);
if (username || !firstName || !lastName ) {
res.json({
haveEmpty: true
});
return;
} else {
db.transaction((trx) => {
db.select('*').from('user').where('username', '=', username)
.then(data => {
if (!data[0]) {
db('user')
.returning('*')
.insert({
username: username,
first_name: firstName,
last_name: lastName,
})
.then(user => {
db('login')
.returning('*')
.insert({
username: username,
hash: hash
})
.then(login => {
if (login[0]) {
res.json({
isSuccess: true
});
return;
} else {
res.json({
isSuccess: false
});
return;
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
} else {
res.json('User already Exist!');
return;
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
})
.catch(err => logger.error(err));
}
}
而且我不知道我是否正确使用了交易。但这就是我想出的。之前,当我将查询分成两个 Promise 时,我收到一个错误,因为似乎第一个插入(用户)没有完成。
这段代码可以运行,但我知道有更正确的编码方式。
【问题讨论】:
标签: node.js express promise callback knex.js