我的Express.js应用程序一直在投掷Cannot read property 'req' of undefined
.实质上,它会侦听GET
请求,获取content
查询,然后使用表进行回复.这是出现问题的部分.
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
作为回调传递.那么,我该如何解决呢?
我也经历过这个错误,在咀嚼了一下错误信息并且盯着我的代码太久之后,它点击了.
我(和上面的提问者)的代码看起来像这样:
this
问题在于,当res.send稍后被调用时,它与动态范围脱节 - 这意味着send
对res
方法内部的调用(通常会引用global
)现在引用res.send
.显然,this.req
在this
给出错误消息的情况下包含对引用的引用.
等效方案:
somethingAsync .then(res.send) // <-- storing send() divorced from parent object "res" }
或者,换句话说:
res = { send: function() { console.log(this.originalMessage.req); }, originalMessage: { req: "hello SO" }, }; res.send(); // # "hello SO" const x = {}; x.send = res.send; x.send(); // # Uncaught TypeError: Cannot read property 'req' of undefined
两种解决方案
send
理论上更惯用的方法是
res
那个动态范围的有害的小问题.好像快递应该放弃那里的动态范围,或者至少抛出一个更好的错误......