Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中的URL路由_Javascript_Node.js - Fatal编程技术网

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')会生成一个未定义的对象,所以我猜服务器是一个单例对象

我试过什么了

我目前的代码看起来是这样的,不知怎么的,我觉得这是一条路要走,但我显然不能这样做

我省略了所有的
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()
样式,将其实例化并导出。