使用 nodejs 和 lokijs 重新组织简单的应用程序

Reorganize simple app with nodejs and lokijs

这是我的第一个 node.js 应用程序。我使用 http://www.nodebeginner.org/ as example and http://lokijs.org/ 作为内存数据库。 所以,我对代码组织有疑问。现在看起来像下面这样:

index.js

var server = require('./server');
var router=require('./router');
var reqHandler=require('./handler');

var loki=require('lokijs');
var db = new loki('world.json');

var handle={
    '/getById':reqHandler.getById
};
db.loadDatabase({},function(){
    server.start(router.route, handle,db)
});

server.js

var http = require('http');
var url = require('url');

function start(route,handle,db){
    http.createServer(function (req, res) {
            route(req, res, handle,db);
    }).listen(8080);
}

exports.start=start;

router.js

var url = require('url');

function route(req,res,handle,db) {
    var pathname = url.parse(req.url).pathname;
    if (typeof handle[pathname] === 'function') {
        handle[pathname](res, req,db);
    } else {
        //process error
    }
}

exports.route = route;

handler.js

var url = require('url');
var loki=require('lokijs');
var querystring=require('querystring');

function getById(res, req,db){
    //process req. send response
    //HERE db MUST BE ACCESSIBLE
}

exports.getById=getById;

根据当前的代码结构,我必须将 db 变量从最开始的 index.js 传递到最后的 handler.js。这对我来说似乎不是很好的解决方案。

有人可以帮我吗?提前致谢。

我在编写 snaptun(LokiJS 的 http 服务器包装器,仍在开发中)时遇到了同样的问题。我发现最好的解决方案是创建一个函数,该函数采用 db 参数来生成所有路由(因此 db 仅传递一次并以闭包方式保留)所以在我的 index.js 我最终得到:

var db = new loki(file, {
    autoload: false
  }),
  routes = require('./routes')(db);

自然地 routes.js 需要导出函数而不是对象。 我使用 express 所以在我的例子中我可以简单地迭代 routes 数组并以编程方式设置路由。 这是包含 WIP 作品的回购:snaptun