我有一个node.js / express应用程序使用node-postgres模块与Postgres数据库进行通信。它正在使用async / await,但如果我将返回的对象重命名为 {rows} 以外的任何内容,则它将返回undefined。这是我的代码;请注意async
下方以及const { rows } = ...
上方的评论:
var express = require('express');
var router = express.Router();
const { Pool } = require('pg');
const pool = new Pool({
connectionString: 'postgresql://postgres@localhost/mydb'
});
router.post('/login', function(req, res, next) {
var username = req.body.username;
var password = req.body.password;
(async () => {
// if I rename this from "rows" to, say, "userdetails", it comes back undefined
const { rows } = await pool.query(`
SELECT id, password
FROM myschema.users
WHERE username = $1
LIMIT 1;`,[username]);
if (rows.length) {
// check password, etc, etc.
return res.status(200).send();
} else {
return res.status(401).send();
}
})().catch(e => setImmediate(() => {
res.status(500);
}
));
});
module.exports = router;
我确定我在这里遗漏了一些非常基本的东西,但为什么我不能重命名呢? pg模块是否以某种方式指示返回的var / const必须命名为{ rows }
?如果是这样,我怎么能发现?我在await
处设置了断点并逐步执行代码,但我仍然不清楚。
答案 0 :(得分:1)
这称为Object destructuring
。当你做这样的事情时
Trident.*rv
然后变量const { row } = someObject
等于row
。但如果row property of someObject
甚至没有任何someObject
属性,那么row
显然会row
。
在你的情况下也是如此。 undefined
返回的对象具有await pool.query(...
属性,这就是为什么rows
有效,但它没有const { rows }
属性userdetails
。
答案 1 :(得分:1)
当您执行const { rows } = xxx
时,您正在使用object destructing将xxx.rows
属性分配给本地范围中与该属性同名的新变量。
因此,当您将该属性的名称更改为其他内容时:
const { myVar } = xxx;
代码现在正在查找可能不存在的属性xxx.myVar
,因此最终undefined
。
如果要使用其他名称,则必须使用不同形式的对象解构赋值(包括新名称)或者根本不使用解构,只需指定.rows
属性到一个新的变量。
例如,你可以这样做:
const result = await pool.query(`
SELECT id, password
FROM myschema.users
WHERE username = $1
LIMIT 1;`,[username]);
const myVar = result.rows;
或者你可以在对象解构赋值中指定一个新名称:
const {rows: myVar} = await pool.query(`
SELECT id, password
FROM myschema.users
WHERE username = $1
LIMIT 1;`,[username]);
console.log(myVar);