美文网首页
简单类express实现

简单类express实现

作者: Gary嘉骏 | 来源:发表于2017-11-07 11:29 被阅读0次

最近公司app的开发又缓慢了下来,于是又重新看node,上一次用node实现个人blog(前端angular)已有两个月了。废话不多说,先谈谈最近对node的新理解。

  • node是属于后端,但与C、Java 、Python等后端不一样。node不属于一门语言,只是一个运行Javascript的平台。这也是官网的描述:

Node.js® is a JavaScript runtime built onChrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem,npm, is the largest ecosystem of open source libraries in the world.

  • 那Node为什么选择javascript为载体语言?
    事实上,在实现 Node.js 之初,作者 Ryan Dahl 并没有选择 JavaScript,他尝试过 C、Lua,皆因其欠缺一些高级语言的特性,如闭包、函数式编程,致使程序复杂,难以维护。
      而 JavaScript 则是支持函数式编程范型的语言,很好地契合了 Node.js 基于事件驱动的编程模型。加之 Google 提供的 V8 引擎,使 JavaScript 语言的执行速度大大提高。最终呈现在我们面前的就成了 Node.js,而不是 Node.c,Node.lua 或其他语言的实现。
      还有一点就是方便推广node,JavaScript作为一门脚本语言,已经广受认可,而且JavaScript最近崛起得比较快,十分热门,有各种前辈使用JavaScript去实现各种功能,node打上这个快车就能很容易打入市场,毕竟前端程序员能用较低成本去达成node入门级,然后搭建个小网站或博客时使用一门语言就可以完成了,后面也容易达成全栈。

正文

express的使用

var express = require('express');
var app = express();
app.listen(3000);

能看出引入express时获得的是一个Function,然后调用获得一个对象,最后调用其listen方法去开启服务

由此我们自己可以这样实现

var http=require('http')
var CreateApplication = function(){};
CreateApplication.prototype.listen=function(port,cb){
     var server = http.createServer(function(req,res){
     });
     server.listen(port,cb)
}
var express = function() {
    return new CreateApplication();
} ;

express路由的使用

var express = require('express');
var app = express();
app.use('/',function(req,res){res.end('hello')});
app.listen(3000);

use的方法是对路由的保存

我们自己可以这样实现,对象创建时初始化一个空数组route,然后调用对象的use方法时把路由添加到route里

var CreateApplication = function() {
    this.route = [];
};

CreateApplication.prototype.use = function(path,fn) {
    this.route.push({
        path:path,
        fn:fn
    })
}

要路由生效的话,只需要在http.createServer里循环route去判断就行

CreateApplication.prototype.listen = function(port,cb) {
    var self = this;
    var server = http.createServer(function(req,res) {
        for(let i=0,len = self.route.length;i<len;i++) {
            let tar = self.route[i];
            if(tar.path == req.url) {
                return tar.fn(req,res);
            }
        }
        res.end('Cannot '+req.method+' '+ req.url);
    });
    server.listen(port,cb)
};

所有代码及验证

var http = require('http');

var CreateApplication = function() {
    this.route = [];
};

CreateApplication.prototype.use = function(path,fn) {
    this.route.push({
        path:path,
        fn:fn
    })
}

CreateApplication.prototype.listen = function(port,cb) {
    var self = this;
    var server = http.createServer(function(req,res) {
        for(let i=0,len = self.route.length;i<len;i++) {
            let tar = self.route[i];
            if(tar.path == req.url) {
                return tar.fn(req,res);
            }
        }
        res.end('Cannot '+req.method+' '+ req.url);
    });
    server.listen(port,cb)
};

var express = function() {
    return new CreateApplication();
}

var app = express();
app.use('/hello',(req,res) => res.end('hello world'));
app.use('/hey',(req,res) => res.end('hey world'))
app.listen(3001,() => {
    console.log('running on port'+3001);
})

如果觉得文章对你有点用的话,麻烦拿出手机,这里有一个你我都有的小福利(每天一次): 打开支付宝首页搜索“8601304”,即可领红包。谢谢支持

相关文章

网友评论

      本文标题:简单类express实现

      本文链接:https://www.haomeiwen.com/subject/grmdmxtx.html