2017-12-03 150 views
0

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

回答

1

當您執行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

1

這叫做。當你做這樣的事情

const { row } = someObject 

那麼變量row等於row property of someObject。但如果someObject甚至沒有任何row財產,那麼row明顯將爲undefined

你的情況也是如此。 await pool.query(...返回的對象有rows屬性,這就是爲什麼const { rows }有效,但它沒有userdetails屬性,因此undefined

相關問題