2017-01-23 165 views
1

我的Express.js應用程序一直在擲Cannot read property 'req' of undefined。實質上,它會偵聽GET請求,獲取content查詢,然後回覆一個表。以下是提出問題的部分。Express.js無法讀取undefined屬性'req'

index.js

var panels = require('./modules/panels.js'); 
app.get('/panel', function (req, res) { 
    var user; 
    if (user = req.session.user) { 
     panels.getContents(req.query.content, user.innId, res.send); 
    } else { 
     res.sendStatus(401); 
    } 
}); 

模塊/ panels.js

exports.getContents = function(panelName, innId, callback) { 
    var response = ""; 
    switch (panelName) { 
     case 'tenants': 
      con.query(queryString, queryParams, function(err, rows) { 
       if (err) { 
        handle(err); 
       } else { 
        if (rows.length == 0) { 
         var tenants = 0; 
         var debtors = 0; 
        } else { 
         var tenants = rows[0].tenants; 
         var debtors = rows[0].length; 
        } 
        response = convertToHTMLTable(rows); 
       } 
       callback(response); /*THE ERROR POINTS HERE */ 
      }); 
      break; 

     /* other cases here */ 

     default: 
      response += "Invalid Request"; 
      callback(response); 
    } 
} 

我做了什麼錯?我的猜測是,我不假設通過res.send作爲回調。那麼,我該如何解決它?

+1

你嘗試用'()=> res.send()'替換'res.send'嗎? –

+1

'user = req.session.user'應該是'user == req.session.user',究竟是哪一行會拋出錯誤? –

+0

@AdamAzad不,我想分配會話給用戶,同時檢查它是否真實。我在那裏發表了一條錯誤的評論。它在panels.js中。 – starleaf1

回答

2

嘗試這種在index.js

panels.getContents(req.query.content, user.innId, res); 

進入panels.js

exports.getContents = function(panelName, innId, response) { 
    var response = ""; 
    switch (panelName) { 
     case 'tenants': 
      con.query(queryString, queryParams, function(err, rows) { 
       if (err) { 
        handle(err); 
       } else { 
        if (rows.length == 0) { 
         var tenants = 0; 
         var debtors = 0; 
        } else { 
         var tenants = rows[0].tenants; 
         var debtors = rows[0].length; 
        } 
        response.send(convertToHTMLTable(rows)); 
       } 
      }); 
      break; 

     /* other cases here */ 

     default: 
      error += "Invalid Request"; 
      response.send(error) 
    } 
} 
+0

給未來讀者的提示:在這個答案有效之前,我必須做些修改,但是如果不透露我的代碼太多,我不能編輯它。 – starleaf1

+0

也重命名var response =「」; var error –

10

所以,代碼,問題和答案在這裏都非常無益的,但我做了最後找出這個錯誤的根源,我相信我經歷過和作者一樣的原因。

我有一個看起來像這樣的代碼:

handler(req, res) { somethingAsync .then(res.send) }

的問題是,當res.send被後來稱爲,這是由它的動態範圍離婚 - 這意味着內部調用thissend方法,通常會參考res,現在參考undefined。顯然,res.send包含對this.req的引用,並給出錯誤消息。

天真的答案是

handler(req, res) { somethingAsync .then(() => res.send()) }

而且理論上更地道的做法是動態作用域的

handler(req, res) { somethingAsync .then(res.send.bind(res)) }

惡性小疑難雜症,那一個。看起來像快遞應該溝動動態範圍在那裏,或者給出更好的錯誤...

+1

剛剛也有這個問題。謝謝! –