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

我有一个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

回到顶部