我正在使用带有node.js的Knex创建一个表并向其插入一些数据。首先,我首先创建表,然后插入数据,但最终结果是有时候在插入数据时还没有创建表。然后我最终使用如下的回调。现在我混合了回调和承诺,我不确定它是否是非常好的事情。如何在没有回调的情况下进行以下工作,并且在插入数据之前仍然要注意创建表?
function executeCallback(next, tableName) {
knex.schema.hasTable(tableName)
.then((exists) => {
if (!exists) {
debug('not exists');
// Table creation for mysql
knex.raw(`CREATE TABLE ${tableName} ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, timestamp BIGINT NOT NULL, deviceId VARCHAR(255) NOT NULL, data JSON )`)
.then((rows) => {
debug(rows);
next('Table created (mysql)');
})
.catch((err) => {
debug(`Error: ${err}`);
next(`Error: ${err}`);
});
} else {
debug('Table exists');
next('Table exists');
}
});
}
executeCallback((response) => {
debug('back from callback', response);
debug('insert');
knex(req.body.tableName).insert({
timestamp: req.body.timestamp,
deviceId: req.body.deviceId,
data: req.body.data,
})
.catch((err) => {
debug(`Error: ${err}`);
res.status(500).json({ success: false, message: `Error: ${err}` });
})
.then((dataid) => {
debug(`Inserted with id: ${dataid}`);
res.status(201).json({ success: true });
});
}, req.body.tableName);
答案 0 :(得分:0)
一般情况下,不鼓励混合回调和Promise。我建议查看使用Promises的async/await
模式,因为这通常更容易在代码中阅读。它也适用于knex js。
Node回调的一个技巧是函数参数的约定,其中第一个参数是错误,第二个参数是成功结果。像这样:function (error, results) {...}
这使得结果很容易检查,比如
if(error) {
// do error stuff
return
}
// do success stuff with `results`
可以将next(new Error('bad'))
之类的函数称为错误,或next(null, 'success object')
成功。
您的回调next
只接受一个参数,而您没有检查其值。重要的是结果是“表存在”'表创建'还是'错误',你接下来要做什么。
您可以尝试这样的事情:
async function handleInsert(tableName, res) {
try {
let hasTable = await knex.schema.hasTable(tableName)
if(!exists) {
let createResult = await knex.raw(`CREATE TABLE...`)
// check create results, throw if something went wrong
}
//table guaranteed to exist at this point
let insertResult = await knex(req.body.tableName).insert({
timestamp: req.body.timestamp,
deviceId: req.body.deviceId,
data: req.body.data,
})
debug(`Inserted with id: ${insertResult}`) //might need insertResult[0]
res.status(201).json({ success: true })
} catch(err) {
// any error thrown comes here
console.log('Server error: ' + err)
res.error('Bad thing happened, but do not tell client about your DB')
}
}
还有一件事。通常,您可以假设您已经存在所需的表。或者使用migration在服务器启动/更新时构建数据库。