我最终试图var server = require('../../index.js');
在我的foo-dao.js
文件中要求,这样我就可以访问 hapi 服务器插件,而不必通过 hapirequest
对象从控制器传递到 dao。
尝试在文件顶部要求 index.js 时,可以在我的 foo-dao.js 方法的注释中看到该问题。
我相信问题是因为在我的 index.js 中,它需要 ./modules 文件夹,该文件夹需要 ./modules/foo/foo-routes.js 需要 ./modules/foo/foo-ctrl.js 需要./modules/foo/foo-dao.js。
这是需求的简化视图
./modules/index.js -> ./modules/foo/foo-routes.js -> ./modules/foo/foo-ctrl.js -> ./modules/foo/foo-dao.js -> ./ modules/index.js <-- 问题出在这里,因为我在 INDEX.JS 中的服务器变量尚未公开。
/hapi/index.js
/**
* Hapi.js server.
*
* @type {exports}
*/
var Hapi = require('hapi');
var modules = require('./modules');
// Instantiate the server
var server = new Hapi.Server('0.0.0.0', 4445, {cors: true, debug: {request: ['error']}});
...
/**
* Add all the modules within the modules folder
*/
for(var route in modules) {
server.route(modules[route]);
}
/**
* Expose the server's methods when used as a require statement
*
* @type {exports.server}
*/
module.exports = server;
/hapi/modules/foo/foo-routes.js
var Joi = require('Joi');
var fooController = require('./foo-ctrl');
module.exports = function() {
return [
{
method: 'GET',
path: '/api/foo',
config: {
handler: fooController.foo//,
}
}
]
}();
/hapi/modules/foo/foo-ctrl.js
var fooDao = require('./foo-dao');
module.exports = function() {
return {
foo: function foo(req, reply) {
fooDao.findFoo(function(err, data) {
if (err) {
return reply(Boom.badImplementation(err));
}
reply(data);
});
}
}
}();
/hapi/modules/foo/foo-dao.js
var server = require('../../index.js'); // WHEN I REQUIRE THE FILE HERE, IT'S UNDEFINED, PROBABLY BECAUSE THE server OBJECT HAS NOT BEEN EXPOSED YET
console.log('server = ');
console.log(server);
module.exports = function() {
return {
findFoo: function findFoo(callback) {
var server = require('../../index.js'); // WHEN I REQUIRE THE FILE HERE, IT'S ACTUALLY DEFINED, PROBABLY BECAUSE THE server OBJECT HAS BEEN EXPOSED BY THIS POINT. I DON'T WANT TO HAVE TO REQUIRE INDEX.JS IN EVERY SINGLE FUNCTION THOUGH. HOW CAN I CIRCUMVENT THIS PROBLEM?
... get data and return it in the callback
}
}
}();