簡體   English   中英

在 Promise 中傳遞查詢結果

[英]Passing results of queries in promises

我正在使用 node-postgres 進行數據庫連接。 為此,我有這樣的 API:

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

現在我需要同步步驟:

  1. Select 來自表用戶的特定 ID
  2. 檢查表用戶的 id 是否已存在於表列表中 3a) 如果表列表中的 id 不存在,則在表列表中插入數據 3b) 如果表列表中的 id 存在,則更新表列表中的數據

所以我有以下代碼:

var userid = 0;
var listEntry = 0;

client
.query('SELECT "ID" FROM "User" WHERE "PW" = $1 AND "Name" = $2', [req.body.pw, req.body.name])
.then(res => userid = res.rows[0])
.catch(e => console.error(e.stack))
.query('SELECT " FROM "List" WHERE "UserID" = $1', [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" = $1', [req.body.date])
.then(res => userid = res.rows[0])
.catch(e => console.error(e.stack))
.finally(() { client.end()
});

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

無論您在一個中返回什么,然后都會在下面結束。 例如:

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

第一個日志打印 42 ,因為前一個then 42 ,第二個打印undefined因為前一個then nothing = undefined 所以你實際上想要這樣的東西:

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

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

使用async/await時,代碼可以更加簡化。

如果您不想執行以下查詢,因為第一個響應中沒有行,您可以執行以下操作:

client.query('SELECT "ID" FROM "User" WHERE "PW" = $1 AND "Name" = $2', [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" = $1', [userid]).then(() => {
                return client.query('INSERT INTO "List" ("UserID", "LastDate")', [userid, req.body.date]);
            }).then(() => {
                return client.query('UPDATE "List" SET "LastDate" = $1', [req.body.date])
            })
        }
    })
    .catch(error => console.error(error))
    .finally(() => client.end());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM