当前位置:  开发笔记 > 编程语言 > 正文

Express.js无法读取未定义的属性'req'

如何解决《Express.js无法读取未定义的属性'req'》经验,为你挑选了1个好方法。

我的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作为回调传递.那么,我该如何解决呢?



1> Kyle Baker..:

我也经历过这个错误,在咀嚼了一下错误信息并且盯着我的代码太久之后,它点击了.

我(和上面的提问者)的代码看起来像这样:

this

问题在于,当res.send稍后被调用时,它与动态范围脱节 - 这意味着sendres方法内部的调用(通常会引用global)现在引用res.send.显然,this.reqthis给出错误消息的情况下包含对引用的引用.

等效方案:

  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

那个动态范围的有害的小问题.好像快递应该放弃那里的动态范围,或者至少抛出一个更好的错误......


刚刚遇到这个问题.谢谢!
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有