在承诺中传递查询结果

Passing results of queries in promises

我正在使用 node-postgres 进行数据库连接。为此,我有这样的 API:

app.post('/api/insert', urlEncodedParser, function(req, res) {
    // do stuff
})

现在我需要同步步骤:

  1. Select 来自 table 用户的特定 ID
  2. 检查 table 用户的 ID 是否已经存在于 table 列表中 3a) 如果table列表中的id不存在,则在table列表中插入数据 3b) 如果table列表中的id存在,则更新table列表中的数据

所以我有以下代码:

var userid = 0;
var listEntry = 0;

client
.query('SELECT "ID" FROM "User" WHERE "PW" =  AND "Name" = ', [req.body.pw, req.body.name])
.then(res => userid = res.rows[0])
.catch(e => console.error(e.stack))
.query('SELECT " FROM "List" WHERE "UserID" = ', [userid])
.then(res => listEntry = res.rows[0])
.catch(e => console.error(e.stack))
.query('INSERT INTO "List" ("UserID", "LastDate")', [userid, req.body.date])
.then(res => userid = res.rows[0])
.catch(e => console.error(e.stack))
.query('UPDATE "List" SET "LastDate" = ', [req.body.date])
.then(res => userid = res.rows[0])
.catch(e => console.error(e.stack))
.finally(() { client.end()
});

我需要更改什么才能拥有上面列出的同步步骤?抱歉,我是 javascript 和 node-postgres 的新手。

无论你 return 在一个然后在下面结束。例如:

client.query("SELECT...")
    .then((result) => {
        // do something with the result
        return 42;
    })
    .then((result) => console.log(result))
    .then((result) => console.log(result))

第一个日志打印 42 因为之前的 then returned 42 第二个打印 undefined 因为之前的 then return 什么都没有 = undefined。所以你实际上想要这样的东西:

client.query('SELECT "ID" FROM "User" WHERE "PW" =  AND "Name" = ', [req.body.pw, req.body.name])
    .then((res) => {
        const userid = res.rows[0];
        return client.query('SELECT " FROM "List" WHERE "UserID" = ', [userid]).then(() => {
            return client.query('INSERT INTO "List" ("UserID", "LastDate")', [userid, req.body.date]);
        });
    })
    .then(() => {
        return client.query('UPDATE "List" SET "LastDate" = ', [req.body.date])
    })
    .catch(error => console.error(error))
    .finally(() => client.end());

这是您甚至不需要半全局变量 useridlistEntry。这通常是一件好事。

使用async/await时可以更加简化代码。

如果您不想执行以下查询,因为第一个响应中没有行,您可以这样做:

client.query('SELECT "ID" FROM "User" WHERE "PW" =  AND "Name" = ', [req.body.pw, req.body.name])
    .then((res) => {
        if (res.rows.length > 0) {
            const userid = res.rows[0];
            return client.query('SELECT " FROM "List" WHERE "UserID" = ', [userid]).then(() => {
                return client.query('INSERT INTO "List" ("UserID", "LastDate")', [userid, req.body.date]);
            }).then(() => {
                return client.query('UPDATE "List" SET "LastDate" = ', [req.body.date])
            })
        }
    })
    .catch(error => console.error(error))
    .finally(() => client.end());