javascript - 仅当唯一时使用 knex 插入

标签 javascript sql postgresql asynchronous knex.js

我正在编写一个 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"

最佳答案

我不确定问题是由于 knex 的异步性质造成的,还是其他原因造成的。但是,我重新编写了您的代码以使用 async/await 语法使其更具可读性。自从我添加了 .first() 之后,我还只是检查设备是否返回为 null 而不是数组。当您调用此函数时,您能否检查并查看 device 是否记录了控制台?

app.post('/testsite', async (req, res) => {
  const data = (req.body.measurements);
  for (let i = 0; i < data.length; i++) {
    const device = await database
      .select('*')
      .from('device_info')
      .where('device_id', data[i].device_id)
      .first();
    console.log(device);
    if (device) {
      const newDevice = await database
        .from('device_info')
        .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
        })
        .returning('*');

      return newDevice;
    } else {
      return device;
    }
  }
});

关于javascript - 仅当唯一时使用 knex 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57011016/

相关文章:

sql - Postgres 选择不同的笛卡尔积

postgresql - 如何用数组创建异常的解析器?

postgresql - 使用 Docker : sqlalchemy. exc.OperationalError : (psycopg2. OperationalError) FATAL: 用户 "username"的密码验证失败

javascript - Ui-Tabs 中的 Google Maps Api v3 map 被剪切

MySQL 外键错误,删除级联时

javascript - 具有所需属性的 summernote textarea 不起作用

sql - 从一组范围计算并发性

sql - 在 PIVOT 运算符中分组

javascript - 在 javascript 中执行条件数组方法的最佳方法

javascript - 不同 iOS 设备(Cordova/phonegap)的 safari 中的不同主体