2017-01-23 161 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

刚刚也有这个问题。谢谢! –