【问题标题】:Hapi showing undefined variable inside handlerHapi 在处理程序中显示未定义的变量
【发布时间】:2026-01-29 12:40:01
【问题描述】:

我正在为一个项目使用 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;
}

controllers/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;

【问题讨论】:

    标签: javascript node.js hapijs


    【解决方案1】:

    问题在于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

    【讨论】: