[英]Why can't I rename this object in my node application?
我有一個node.js / express應用程序,它使用node-postgres模塊與Postgres數據庫進行通信。 它可以與async / await一起使用,但是如果我將返回的對象重命名為{行}之外的任何其他對象,它將返回未定義的狀態。 這是我的代碼; 注意在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
設置了一個斷點,並逐步執行了代碼,但是我仍然不清楚。
這稱為Object destructuring
。 當你做這樣的事情
const { row } = someObject
那么變量row
等於row property of someObject
的row property of someObject
。 但是,如果someObject
甚至沒有任何row
屬性,則顯然row
將是undefined
。
您的情況也是如此。 由await pool.query(...
返回的對象具有rows
屬性,這就是為什么const { rows }
起作用但沒有userdetails
屬性,因此undefined
。
當您執行const { rows } = xxx
,您正在使用對象 xxx.rows
將xxx.rows
屬性分配xxx.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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.