节点响应挂起

时间:2015-05-11 03:31:06

标签: javascript node.js

我正在尝试创建一个处理我的json响应的主方法,但我遇到的问题是它在我这样做时会挂起。

这是我在转换它之前所拥有的,它运行良好(highscores返回Promise)。

var main = {
    req: {}, res: {}, action: "",
    handleRequest: function(req, res){
        this.req = req;
        this.res = res;
        this.action = "Highscores";
        this.getAction();
    }),
    getAction: function(){
        $this = this;
        if(this.action === "Highscores"){
            highscores.get.highscores({gameId: this.body.gameId}).then(function(docs){
                $this.res.setHeader("Content-Type", "text/json; charset=utf-8");
                $this.res.setHeader("Access-Control-Allow-Origin", "*");
                $this.res.write(JSON.stringify(docs));
                $this.res.end();
            }, function(err){
                $this.res.end();
            });
        }
    }
}
然后我将其转换为:

var main = {
    req: {}, res: {}, action: "",
    handleRequest: function(req, res){
        this.req = req;
        this.res = res;
        this.action = "Highscores";
        this.getAction();
    }),
    getAction: function(){
        if(this.action === "Highscores"){
            highscores.get.highscores({gameId: this.body.gameId}).then(this.respond, this.error);
        }
    },
    respond: function(docs){
        this.res.setHeader("Content-Type", "text/json; charset=utf-8");
        this.res.setHeader("Access-Control-Allow-Origin", "*");
        this.res.write(JSON.stringify(docs));
        this.res.end();
    },
    error: function(err){
        console.log(err);
        this.res.end();
    }
};

当我转换它时,它会挂起this.res.setHeader("Content-Type", "text/json; charset=utf-8");并且Chrome控制台显示它处于待处理状态,并且永远不会以200结束。

造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:2)

当您传递类似函数(.then(this.respond, this.error))时,您将丢失该函数的上下文(this),因为您只是传递函数本身。因此,当最终调用respond()时,this的值可能设置为全局上下文或其他一些对象/值。

如果要保持相同的结构,快速简便的方法是使用绑定版本的函数:.then(this.respond.bind(this), this.error.bind(this))。否则,您将需要使用包装函数,该函数使用适当的上下文调用这两个函数(例如.then(function(docs) { self.respond(docs) }, function(err) { self.error(err) }))(假设var self = this内有getAction())。