Node.js 为什么可以';我不能在我的节点应用程序中重命名此对象吗?

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 =

我有一个node.js/express应用程序使用该模块与Postgres数据库通信。它使用的是async/await,但是如果我将要返回的对象重命名为除{rows}以外的任何对象,它将返回未定义的对象。这是我的密码;注意
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(…
have
rows
property,这就是为什么
const{rows}
可以工作,但它没有
userdetails
属性,因此调用
undefined

const { row } = someObject
然后变量
row
等于某个对象的
row属性。但是如果
someObject
甚至没有任何
row
属性,那么
row
显然将是
未定义的


您的情况也是如此。
wait pool.query(…
have
rows
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变量的所有实例重命名为新变量名?谢谢。列出备选方案非常有用。谢谢。列出备选方案非常有用。