为什么我不能在我的节点应用程序中重命名这个对象?
我有一个node.js/express应用程序使用node-postgres模块与Postgres数据库进行通信。它正在处理异步/等待,但是如果我将对象重命名为{rows}以外的任何其他对象,则会返回undefined。这是我的代码;注意右下async
和注释,上面const { rows } = ...
:为什么我不能在我的节点应用程序中重命名这个对象?
var express = require('express'); var router = express.Router();
const { Pool } = require('pg');
const pool = new Pool({
connectionString: 'postgresql://[email protected]/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
处设置了一个断点并逐步完成代码,但对我而言仍然不清楚。
回答:
当您执行const { rows } = xxx
时,您正在使用object destructing将3210属性分配给本地作用域中与该属性具有相同名称的新变量。
因此,当您更改属性的名称到别的东西:
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);
回答:
这叫做。当你做这样的事情
const { row } = someObject
那么变量row
等于row property of someObject
。但如果someObject
甚至没有任何row
财产,那么row
明显将为undefined
。
你的情况也是如此。 await pool.query(...
返回的对象有rows
属性,这就是为什么const { rows }
有效,但它没有userdetails
属性,因此undefined
。
以上是 为什么我不能在我的节点应用程序中重命名这个对象? 的全部内容, 来源链接: utcz.com/qa/259723.html