所以我是一名系统程序员,目前正在自学Web应用程序编程。在学习新东西的时候总是如此,我还没有牢固掌握惯用的实现,或者简单地说,如何以“正确”的方式做事。
在花了一些时间构建一些游戏和琐碎的UI之后,我只使用HTML和javascript,我现在冒险进入一个非平凡的动态应用程序。我使用Node作为我的服务器,并且有一个关于如何路由响应处理程序的问题。
我正在关注(看似)nice guide found here。这是我到目前为止找到的唯一指南,它将指导您如何构建实际应用程序(而不是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);
}
我在这种方法中没有看到一些缺陷吗?好像它会减少冗余代码,但作为这个领域/技术的初学者,我很怀疑。也许作者只是想保持简单,或者我猜可能就是这样,我错过了一些东西。
提前干杯谢谢。如果您有理由这样做,请不要随意向我提出其他看似无关的建议。
答案 0 :(得分:4)
有很多方法可以做这些事情,我认为指南试图变得简单。
我倾向于做这样的事情:创建在其中有处理程序的模块,并添加一个新的处理程序,只需将它添加到正确位置的模块,它将自动工作......无需修改任何其他码。服务器代码只需要尝试调用 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
}
从你引用的例子来看,这在复杂性/复杂性方面只是一步之遥。你可以坚持下去,直到你拥有一个完整的框架。