Javascript Node.js中的URL路由
完成作业: 背景故事:我想尝试编写自己的框架,但我遇到了一些麻烦,很可能是因为没有完全理解它 我想要实现的语法如下所示:Javascript Node.js中的URL路由,javascript,node.js,Javascript,Node.js,完成作业: 背景故事:我想尝试编写自己的框架,但我遇到了一些麻烦,很可能是因为没有完全理解它 我想要实现的语法如下所示: var app = require('./app'); //this part is understood and it works in my current code. app.get('/someUrl', function(){ //do stuff here }); app.post('/someOtherUrl', function(){ //do stuf
var app = require('./app'); //this part is understood and it works in my current code.
app.get('/someUrl', function(){ //do stuff here });
app.post('/someOtherUrl', function(){ //do stuff here });
var app = module.exports = {
handlers : [],
route : function(url, fn) {
this.handlers.push({ url: url, fn: fn });
},
preProcess: function onRequest(request, response){
processor.preRequest(request);
var path = urllib.parse(request.url).pathname;
var l = this.handlers.length, handler;
for (var i = 0; i < l; i++) {
handler = this.handlers[i];
if (handler.url == path)
return handler.fn(request, response);
}
throw new Error('404 - route does not exist!');
},
// some other code
}
app.route('/someUrl', function(req, res){ //do stuff here });
route : function(url, fn, type) {
this.handlers.push({ url: url, fn: fn, type: type });
},
get : function(url, fn) {
this.route(url, fn, 'GET');
},
post : function(url, fn) {
this.route(url, fn, 'POST');
},
我知道Express框架具有相同的语法,但我仍然无法阅读它们的源代码
这可能是一项微不足道的任务,但我现在还不能完成
试图要求('./app')在应用程序的深层文件中,code>会生成一个未定义的对象,所以我猜服务器是一个单例对象
我试过什么了
我目前的代码看起来是这样的,不知怎么的,我觉得这是一条路要走,但我显然不能这样做
我省略了所有的require()代码>语句以使其更具可读性
server.js:
var app = module.exports = {
preProcess: function onRequest(request, response){
processor.preRequest(request); //this object adds methods on the request object
var path = urllib.parse(request.url).pathname;
router.route(urls, path, request, response);
},
createServer: function() {
console.log("Server start up done.");
return this.server = http.createServer(this.preProcess);
}
};
exports.app = app;
var app = require('./server');
app.createServer().listen('1337');
在撰写本文时,我正在尝试使用get()
方法扩展此对象
index.js:
var app = module.exports = {
preProcess: function onRequest(request, response){
processor.preRequest(request); //this object adds methods on the request object
var path = urllib.parse(request.url).pathname;
router.route(urls, path, request, response);
},
createServer: function() {
console.log("Server start up done.");
return this.server = http.createServer(this.preProcess);
}
};
exports.app = app;
var app = require('./server');
app.createServer().listen('1337');
router.route()
位基本上是将请求向前发送到应用程序中,在router.js文件中,我做了一些魔术,将请求向前发送到一个函数,该函数映射(到目前为止)到被请求的/url
这是我想留下的行为。
我知道这可能是一个相当高的要求,但我所有的代码都很容易被丢弃,我不怕重写整个代码库,因为这是我自己的项目
我希望这足以解释我的问题,否则,请说明我应该补充什么,使之更清楚一些
提前谢谢 我不太确定你的问题是什么,但这里有一些想法:
1)您正在此处创建循环引用:
var app = module.exports = {
// some other code
}
exports.app = app;
将app
添加为app
的属性。不需要最后一行
2)您需要在app
中保存处理程序。您可以尝试以下方法:
var app = require('./app'); //this part is understood and it works in my current code.
app.get('/someUrl', function(){ //do stuff here });
app.post('/someOtherUrl', function(){ //do stuff here });
var app = module.exports = {
handlers : [],
route : function(url, fn) {
this.handlers.push({ url: url, fn: fn });
},
preProcess: function onRequest(request, response){
processor.preRequest(request);
var path = urllib.parse(request.url).pathname;
var l = this.handlers.length, handler;
for (var i = 0; i < l; i++) {
handler = this.handlers[i];
if (handler.url == path)
return handler.fn(request, response);
}
throw new Error('404 - route does not exist!');
},
// some other code
}
app.route('/someUrl', function(req, res){ //do stuff here });
route : function(url, fn, type) {
this.handlers.push({ url: url, fn: fn, type: type });
},
get : function(url, fn) {
this.route(url, fn, 'GET');
},
post : function(url, fn) {
this.route(url, fn, 'POST');
},
另一件事是,我向您展示的代码只为它匹配的给定URL触发第一个处理程序。您可能希望创建涉及多个处理程序(即中间件)的更复杂的路由。在这种情况下,架构可能会有所不同,例如:
preProcess: function onRequest(request, response){
var self = this;
processor.preRequest(request);
var path = urllib.parse(request.url).pathname;
var l = self.handlers.length,
index = 0,
handler;
var call_handler = function() {
var matched_handler;
while (index < l) {
handler = self.handlers[index];
if (handler.url == path) {
matched_handler = handler;
break;
}
index++;
}
if (matched_handler)
matched_handler.fn(request, response, function() {
// Use process.nextTick to make it a bit more scalable.
process.nextTick(call_handler);
});
else
throw new Error('404: no route matching URL!');
};
call_handler();
},
然后在路由算法中检查是否定义了type
属性。如果不是,则使用该路线(未定义
类型表示:始终路线)。否则,另外检查请求的方法是否与类型匹配。你完了 谢谢你的回答!:)我的问题是“如何生成.get(),.post()语法”。我可能不得不改变这个问题。我之所以不想在函数本身中检查get/post,是因为在这个项目中有偏好。谢谢你为我指明了正确的方向!:)我还有一个处理程序文件,我在其中添加了许多以相同名称映射到函数的处理程序,我不确定这是否清楚。这可能是一个完全愚蠢的问题,但处理程序属性没有安装,只是没有定义。@limelights我在2)节的开头定义了它:var app=module.exports={handlers:[],
。是的,我知道,但当我运行它时,它仍然是未定义的,我看在上帝的份上,看不出它为什么会这样做。@limelights-Hmm,也许你应该发布你编写的代码,我们看看它??记住这个
总是指函数的持有者(应用程序
)。您也可以尝试将代码转换为经典的function()
样式,将其实例化并导出。