在承诺中传递查询结果
Passing results of queries in promises
我正在使用 node-postgres 进行数据库连接。为此,我有这样的 API:
app.post('/api/insert', urlEncodedParser, function(req, res) {
// do stuff
})
现在我需要同步步骤:
- Select 来自 table 用户的特定 ID
- 检查 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());
这是您甚至不需要半全局变量 userid
和 listEntry
。这通常是一件好事。
使用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());
我正在使用 node-postgres 进行数据库连接。为此,我有这样的 API:
app.post('/api/insert', urlEncodedParser, function(req, res) {
// do stuff
})
现在我需要同步步骤:
- Select 来自 table 用户的特定 ID
- 检查 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());
这是您甚至不需要半全局变量 userid
和 listEntry
。这通常是一件好事。
使用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());