我正在使用knex with node.js创建一个表并向其中插入一些数据。首先,我先创建表,然后插入数据,但结果是,有时在插入数据时表还没有创建。最后我使用了如下的回调。现在我把回电和承诺混在一起,我不确定这是否是件好事。我该怎么做才能使下面的工作不需要回调,并且在插入数据之前仍然注意表的创建?
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);
1条答案
按热度按时间7tofc5zh1#
一般来说,不鼓励将回调和承诺混合在一起。我建议调查一下
async/await
使用承诺的模式,因为在代码中通常更容易阅读。它与knex-js配合也很好。节点回调的一个技巧是函数参数的约定,其中第一个参数是错误,第二个参数是成功结果。这样地:
function (error, results) {...}
这使得结果很容易检查,比如我们可以像这样调用这个函数
next(new Error('bad'))
错误,或next(null, 'success object')
为了成功。你的回电
next
只接受一个参数,而不检查其值。结果是“table exists”、“table created”还是“error”与下一步的操作有关。您可以尝试以下操作:
还有一件事。通常,您可以假设所需的表已经存在。或者使用迁移在服务器启动/更新时构建数据库。