我使用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;
答案 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