为什么我不能在我的节点应用程序中重命名这个对象?

为什么我不能在我的节点应用程序中重命名这个对象?

问题描述:

我有一个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处设置了一个断点并逐步完成代码,但对我而言仍然不清楚。

+0

以防万一,你重命名的所有实例行变量到你的新变量名? – Alan

当您执行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); 
+0

谢谢。列出替代方案非常有帮助。 – rotarydial

这叫做。当你做这样的事情

const { row } = someObject 

那么变量row等于row property of someObject。但如果someObject甚至没有任何row财产,那么row明显将为undefined

你的情况也是如此。 await pool.query(...返回的对象有rows属性,这就是为什么const { rows }有效,但它没有userdetails属性,因此undefined