簡體   English   中英

為什么不能在節點應用程序中重命名該對象?

[英]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 someObjectrow property of someObject 但是,如果someObject甚至沒有任何row屬性,則顯然row將是undefined

您的情況也是如此。 await pool.query(...返回的對象具有rows屬性,這就是為什么const { rows }起作用但沒有userdetails屬性,因此undefined

當您執行const { rows } = xxx ,您正在使用對象 xxx.rowsxxx.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM