javascript 按顺序执行多个数据库查询(承诺)

4urapxun  于 2022-12-21  发布在  Java
关注(0)|答案(2)|浏览(146)

数据库查询本身不是问题--它们工作得很好。
问题是,我需要按顺序执行所有这些命令:

DELETE FROM myTable;
INSERT INTO myTable(c1, c2, c3) VALUES (x, y, z);
SELECT * FROM myTable;

无论我怎么尝试,我都不知道如何在Node中做到这一点。This question似乎是流量最大的解决方案,它会让我做这样的事情(其中clientfrom pg,应该返回承诺):

// client is my database client, has already been initialized
// f is an object corresponding to my database
var res;
Promise.resolve()
      .then(() => {
          console.log("Deleting");
          return client.query("DELETE FROM FileFormat");
      })
      .then(() => {
        console.log("Inserting");
        return client.query("INSERT INTO myTable(c1, c2, c3) VALUES ($1, $2, $3)", [f.x, f.y, f.z]);
      })
      .then(() => {
        console.log("Selecting");
        return client.query("SELECT * FROM FileFormat").then((err, result) => res = result.rows)
      })
      .then(() => {
        console.log("Finished");
        console.log(res);
      })

我希望它打印Deleting,然后是Inserting,然后是Selecting,然后是Finished,然后是我刚刚插入到数据库中的数据。
相反,它打印Deleting,然后什么也不做。
我不想无限链接client.query.then(client.query.then(...)),因为这会使我的代码变得任意缩进。我宁愿让我的代码尽可能扁平,并顺序执行这些调用,等待每个调用完成后再开始下一个调用。我该怎么做呢?

mcdcgff0

mcdcgff01#

从我对原始问题的注解中回答

客户端实际上可能没有解析会导致此行为的承诺。如果删除所有client.query,您将看到所有日志看起来都与您预期的一样。您的Javascript代码已经在执行您想要的操作,问题似乎出在PG客户端。

gmxoilav

gmxoilav2#

因此,我能够通过遵循此模式在我的ExpressJS应用程序中实现此功能。
本质上,您启动了:

try{
      client.query('BEGIN'); 
      // ....do your sequential actions within here.
      client.query('COMMIT'); 
    }catch(e){
      // handle error messaging here
      client.query('ROLLBACK')
    }

对于ExpressJS,我将我的代码封装在IIFE中(上面没有显示,但仍然在文档中的某个地方)。因此,上面的代码看起来如下所示:

;(async() => {
     //above code in here.
   })()
   .catch((e)=>{ 
    //do the thing.
   });

node-postgres指南here.我已经从下面的站点粘贴了代码片段。

const { Pool } = require('pg')
     const pool = new Pool()
 
     // note: we don't try/catch this because if connecting throws an exception
     // we don't need to dispose of the client (it will be undefined)
     const client = await pool.connect()
 
     try {
       await client.query('BEGIN')
       const queryText = 'INSERT INTO users(name) VALUES($1) RETURNING id'
       const res = await client.query(queryText, ['brianc'])
 
       const insertPhotoText = 'INSERT INTO photos(user_id, photo_url) VALUES ($1, $2)'
       const insertPhotoValues = [res.rows[0].id, 's3.bucket.foo']
       await client.query(insertPhotoText, insertPhotoValues)
       await client.query('COMMIT')
     } catch (e) {
       await client.query('ROLLBACK')
       throw e
     } finally {
       client.release()
     }

相关问题