因此,我是一个系统程序员,目前正在自学自己的web应用程序编程。就像学习新东西时一样,我还没有牢牢掌握惯用的实现,或者简单地说,如何用“正确”的方式去做一些事情。
在花了一些时间构建一些游戏和一些简单的UI(只使用HTML和javascript )之后,我现在冒险进入一个非平凡的动态应用程序。我使用Node作为我的服务器,并有一个关于如何路由响应处理程序的问题。
我在跟踪一个(似乎) 不错的导游在这里找到。到目前为止,这是我找到的唯一指导您如何构建实际应用程序的指南(与response.write("Hello world"); response.end();不同)。
作者建议添加这样的响应处理程序:
var server = require("./server");
var router = require("./router");
var requestHandlers = require("./requestHandlers");
var handle = {}
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;
server.start(router.route, handle);代码应该是不言自明的,但实际上,他使用一个对象作为关联容器,将查询字符串中请求的资源映射到处理程序。这一切都很好,但是我想避免每次添加新的处理程序时都向这个文件添加一行。
我的想法是:为每个处理程序创建一个模块,并使用一些公共接口来处理响应。类似于:
function handleReq(...) {
...
}
exports.handleRequest = handleReq;然后我可以动态地require模块,即,
// in my router module
function route(pathName, args) {
// where 'pathName' is something obtained
// in a manner like so in the request handler:
// url.parse(request.url).pathname;
var handler = require(pathName);
handler.handleRequest(args);
}在这种方法中,我有没有发现什么缺陷?它似乎会减少冗余代码,但作为这个领域/技术的初学者,我对此表示怀疑。也许作者只是想保持简单,或者就像我猜想的那样,我遗漏了一些东西。
提前干杯和感谢。如果你觉得有理由这样做的话,也不要随意地向我提出其他看似无关的建议。
发布于 2011-11-15 22:52:05
做这样的事情有很多种方法,我想导游只是想简单些。
我倾向于这样做:创建在其中包含处理程序的模块,而要添加一个新的处理程序,只需将其添加到正确的位置,work...no就会自动修改任何其他代码。服务器代码只需尝试调用moduleName.handleRequest(scriptName、req、resp);如果它返回true,则成功。(它可以在所有有处理程序的模块上尝试,如果没有返回true,它可以显示404)
假定scriptName已经对其进行了路径修整(因此"/start“只是”开始“,等等),如果您真的需要使用路径来确定将它分派给哪个处理程序,我相信您可以以一种优雅的方式构建它,但我没有费心。
在模块本身中,您可以拥有这样的内容:
var handlers = {
start : function (req, resp) {
// ...
},
upload : function (req, resp) {
// ...
}
};
export.handleRequest(name, req, resp) {
if (handlers[name] !== undefined) {
handlers[name](req,resp);
return true;
}
// do special cases (if there are any)
if (name === '') {
handlers.start(req,resp);
return true;
}
return false; // not found
}从你所举的例子来看,这实际上只是在复杂性/复杂性方面提高了一步。你可以一直往前走,直到你有了一个完整的框架。
https://stackoverflow.com/questions/8143762
复制相似问题