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

时间:2017-12-03 06:09:50

标签: node.js postgresql express

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

2 个答案:

答案 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 destructingxxx.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);