Node.js 为什么可以';我不能在我的节点应用程序中重命名此对象吗?
我有一个node.js/express应用程序使用该模块与Postgres数据库通信。它使用的是async/await,但是如果我将要返回的对象重命名为除{rows}以外的任何对象,它将返回未定义的对象。这是我的密码;注意Node.js 为什么可以';我不能在我的节点应用程序中重命名此对象吗?,node.js,postgresql,express,Node.js,Postgresql,Express,我有一个node.js/express应用程序使用该模块与Postgres数据库通信。它使用的是async/await,但是如果我将要返回的对象重命名为除{rows}以外的任何对象,它将返回未定义的对象。这是我的密码;注意async下面和const{rows}=…上面的注释: var express = require('express'); var router = express.Router(); const { Pool } = require('pg'); const pool =
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}
?如果是这样,我怎么会发现呢?我在wait
处设置了一个断点,然后逐步遍历代码,但我仍然不清楚。这就是所谓的。当你这样做的时候
const { row } = someObject
然后变量行
等于某个对象的行属性
。但是如果某个对象
甚至没有任何行
属性,那么行
显然将是未定义的
你的情况也是如此。wait pool.query(…
haverows
property,这就是为什么const{rows}
可以工作,但它没有userdetails
属性,因此调用undefined
const { row } = someObject
然后变量row
等于某个对象的row属性。但是如果someObject
甚至没有任何row
属性,那么row
显然将是未定义的
您的情况也是如此。wait pool.query(…
haverows
property,这就是为什么const{rows}
可以工作,但它没有userdetails
属性,因此当您执行const{rows}时,未定义的=xxx
,用于将xxx.rows
属性分配给本地范围内与属性同名的新变量
因此,当您将该属性的名称更改为其他名称时:
const { myVar } = xxx;
代码现在正在查找属性xxx.myVar
,该属性可能不存在,因此结果是未定义
如果要使用不同的名称,则必须使用不同形式的对象分解赋值(包括新名称),或者根本不使用分解,只需将.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{rows}=xxx
时,您使用将xxx.rows
属性分配给本地范围内与属性同名的新变量
因此,当您将该属性的名称更改为其他名称时:
const { myVar } = xxx;
代码现在正在查找属性xxx.myVar
,该属性可能不存在,因此结果是未定义
如果要使用不同的名称,则必须使用不同形式的对象分解赋值(包括新名称),或者根本不使用分解,只需将.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);
以防万一,是否将rows变量的所有实例重命名为新变量名?以防万一,是否将rows变量的所有实例重命名为新变量名?谢谢。列出备选方案非常有用。谢谢。列出备选方案非常有用。