我们使用knex.js生成和执行SQL。在向现有表中添加字段时,我们遇到了捕获错误的问题,并且文档没有涵盖这个特定的用例。尝试添加重复字段确实会在控制台(VSCODE)中返回错误,但没有对错误调用任何标准事件,因此我们无法在代码中捕获它。这是代码:
knex.schema.table(tableName, function(table) {
table.string('test').catch(function(e) {
callback(e)
});
}).then(function(e) {
callback(e);
}).catch(function(e) {
callback(e);
})
这在VSCODE控制台中返回:
{ [TypeError: table.string(...).catch is not a function] 'error@context': { accessToken: undefined } }
但是,没有调用任何回调。添加字段时如何检查错误?
UPDATE#1此代码将调用回调,但显然没有任何错误信息。而且,控制台中也会出现相同的错误:
table.string('test').catch(
callback(null, Lib.returnEvent(false))
);
UPDATE#2不使用以下代码调用回调:
knex.schema.table(tableName, function(table) {
table.string('ddd');
}).then(function(e) {
callback(e);
}).catch(function(e) {
callback(e);
})
UPDATE#3在本例中,调用了第一个回调,但函数挂起在后续调用上:
knex.schema.table(tableName, function(table) {
table.string('ddd');
callback(true);
}).then(function(e) {
callback(true, e);
}).catch(function(e) {
callback(false, e);
})
我能够通过切换到Knex回调方法而不是使用promise方法来解决这个问题。此代码工作一致:
knex.schema.table(tableName, function(table) {
table.string(tableFieldname);
}).asCallback(function(err) {
if (err) {
callback(false, err);
} else {
callback(true);
}
})
这适用于我的
return knex('users')
.insert({
username: req.body.username,
password: hash,
})
.returning('*')
.bind(console)
.then(console.log)
.catch(console.error);