Hapi показывает неопределенную переменную внутри обработчика

Я использую Hapi.js для проекта, и переменная конфигурации, которую я передаю своему обработчику, появляется как undefined, когда я вызываю свой маршрут. Что я делаю не так?

сервер.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;

person minustime    schedule 01.11.2014    source источник


Ответы (1)


Проблема связана с правом собственности на this. Значение this в любом заданном вызове функции определяется тем, как функция вызывается, а не тем, где функция определена. В вашем случае выше this имел в виду глобальный объект this.

Подробнее об этом можно прочитать здесь: Что это значит?

Короче говоря, решение проблемы состоит в том, чтобы изменить route.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

person John    schedule 01.11.2014
comment
Спасибо за ответ Джон! это имеет смысл. Я загружаю свои обработчики динамически, я урезал код только для этого примера. Мог ли я использовать внутреннюю переменную внутри домашнего контроллера для хранения моей переменной конфигурации? Я бы очень хотел узнать, как правильно использовать Hapi, но я не встречал проекта типа кухонной раковины, который демонстрирует лучшие практики Hapi. Есть ли еще проекты, похожие на ваш, на которые мне следует обратить внимание? - person minustime; 03.11.2014
comment
Вот несколько: github.com/smaxwellstewart/hapi-dash github.com/jedireza/frame github.com/poeticninja/hapi-ninja И более сложная версия, в которой для установки используется интерфейс командной строки Hapi: github.com/hueniverse/postmile - person John; 22.12.2014