【发布时间】:2019-07-12 16:43:42
【问题描述】:
我正在编写一个 Node.js 脚本,它接受一组对象,这些对象代表记录不同测量值的不同设备。我想使用 Knex.js 将有关设备的信息存储在 PSQL 数据库中,但只想存储来自表示新/唯一设备的对象的设备信息。只要同一设备出现在不同的 POST 请求中,在插入之前验证 device_id 似乎就可以工作。但是当同一个设备出现时 在同一个 POST 请求中,似乎程序的异步特性导致验证在插入完成之前发生。
我试图让脚本调用两个单独的异步等待函数(一个用于验证,另一个用于实际插入),但不确定这是否是最简单的方法,或者我是否做对了,因为它无论如何都失败了。
app.post('/testsite', (req, res) => {
const data = (req.body.measurements);
for (let i = 0; i < data.length; i++) {
database.select("device_id").from("device_info").where("device_id", data[i].device_id)
.then(MatchList => {
console.log(MatchList);
if (MatchList.length === 0) {
return database('device_info')
.returning('device_id')
.insert({
device_id: data[i].device_id,
device_name: data[i].device_name,
site_id: data[i].site_id,
site_name: data[i].site_name
})
.then((newdevice) => {
console.log('inserted device id', newdevice);
});
}
return;
});
}
});
我希望它在验证失败时不会插入,但似乎验证永远不会失败,即使它应该失败,我得到这个错误:
Unhandled rejection error: duplicate key value violates unique constraint "device_info_pkey"
【问题讨论】:
-
哪个验证?
-
@alfasin 验证是当我选择数据库中 device_id === data[i].device_id 的所有条目并确保所有这些条目的长度为 0 时。基本上没有这样设备退出。当且仅当这是真的,那么应该尝试插入。
-
你在使用knex吗?
-
@technogeek1995 是的!
标签: javascript sql postgresql asynchronous knex.js