Hapi在处理程序中显示未定义的变量

时间:2014-11-01 06:43:12

标签: javascript node.js hapijs

我使用Hapi.js作为项目,并且当我调用我的路线时,我传递给我的处理程序的配置变量将以 undefined 的形式出现。我做错了什么?

server.js

var Hapi = require('hapi');
var server = new Hapi.Server('0.0.0.0', 8080);

// passing this all the way to the handler
var config = {'number': 1};

var routes = require('./routes')(config);
server.route(routes);

server.start();

routes.js

var Home = require('../controllers/home');

module.exports = function(config) {
    var home = new Home(config);
    var routes = [{
        method: 'GET',
        path: '/',
        handler: home.index
    }];
    return routes;
}

控制器/ home.js

var Home = function(config) {
    this.config = config;
}

Home.prototype.index = function(request, reply) {

    // localhost:8080
    // I expected this to output {'number':1} but it shows undefined
    console.log(this.config); 

    reply();
}

module.exports = Home;

1 个答案:

答案 0 :(得分:3)

问题在于this的所有权。任何给定函数调用中this的值取决于函数的调用方式,而不是定义函数的位置。在您的情况下,this指的是全局this对象。

您可以在此处详细了解:What does "this" mean?

简而言之,解决问题的方法是将routes.js更改为以下内容:

var Home = require('../controllers/home');

module.exports = function(config) {
    var home = new Home(config);
    var routes = [{
        method: 'GET',
        path: '/',
        handler: function(request, reply){
            home.index(request, reply);
        }
    }];
    return routes;
}

我已经对此进行了测试,并且按预期工作。在旁注中,通过以这种方式构造代码,您错过了很多hapi功能,我通常使用插件来注册路由,而不是要求所有路由作为模块并使用server.route()

如果您对此有任何疑问,请参阅此项目,请随时打开问题:https://github.com/johnbrett/hapi-level-sample