Node.js学习-一步步完善一个web框架-1

闲来无事,打算深入学习一下Node.js。之前虽说已有过一点Node.js的开发经验,但对Node.js还仅仅局限于了解,很多Node模块也没有比较深入的学习,如文件模块(fs)、http模块、path模块等。
到目前为止也用过两个Node的web框架(express和koa.js),也已经用koa.js搭建了一个完整的web项目。
借着现在这个机会正好深入学习下Node,所以根据自己的理解开始搭建一个web框架吧,也好巩固一下一些基础知识,对于这个框架,我想暂且将至命名为wa.js。
每日一更,借着写博客好好鞭策一下自己。
进入正文。

/****************华丽丽的分割线**********************/
一个最简单的Node.js服务器代码:

const http = require('http');
var server = http.createServer(function(req,res){
    res.statusCode = 200;
    res.setHeader('Content-Type','text/html');
    res.end('<h1>Hello World!</h1>');
});
server.listen(8080);

我们的web框架将从这个小例子开始扩展。所以对于弄清楚这段代码自我感觉也是蛮重要的
1.导入http模块,对于需要搭建一个服务器这个模块是必须的
const http = require('http');
2.创建一个服务器,并传入监听函数。当有请求到来时便会执行这个函数并且将requestresponse作为参数传入
http.createServer(requestListener)
3.监听端口
server.listen(port)
当我们打开localhost:8080是便能看到熟悉的Hello World!了。

说好的要搭建一个web框架呢,那就开始吧

创建一个文件夹,名为wa,结构如下:

wa
|--core
    |--wa.js
|-controller
    |
|-middleware
    |
|-public
    |
|-app.js

讲一下这个结构,
- wa/core文件夹我将用于存放一些框架相关的文件
- wa/controller将用于存放控制器文件
- wa/middleware将用于存放中间件
- wa/public用于存放静态文件,
- wa/app.js是项目入口文件

接下来我们将上面写的简单服务器的例子放到wa.js中去,并且我设想这个框架也是得有中间件的所以wa.js的代码如下:

const fs = require('fs');
const http = require('http');
/**
 * Wa构造函数
 * @constructor
 */
function Wa() {
    this.req = null;
    this.res = null;
    this.server = null;
    this.middleware = [];
    this.init();
}

Wa.prototype = {
    /**
     * 创建一个服务器
     */
    init: function(){
        this.server = http.createServer(this.requestListener.bind(this));
        return this;
    },
    /**
     * 监听端口
     * @param  {Number} port 端口
     */
    listen: function(port) {
        this.server.listen(port);
        return this;
    },
    /**
     * 用于添加中间件
     * @param  {Function} middleware 中间件
     */
    use: function(middleware) {
        if (typeof middleware !== 'function') {
            throw new TypeError('middleware must be a function');
        }
        this.middleware.push(middleware);
    },
    /**
     * ‘request’事件
     * @param  {IncomingMessage} req 请求
     * @param  {ServerResponse} res 响应
     */
    requestListener: function(req,res) {
        this.req = req;
        this.res = res;
        for (var i = 0; i < this.middleware.length; i++) {
            var mid = this.middleware[i];
            mid(this);
        }
    },
    /**
     * 响应HTML文件
     * @param  {String} path HTML文件路径
     */
    render: function(path) {
        var file = fs.readFileSync(path);
        this.res.statusCode = 200;
        this.res.setHeader('Content-Type','text/html');
        this.res.end(file);
    }
}
module.exports = Wa;

在wa/app.js中我们就可以这样使用wa.js:

const Wa = require('./core/wa');
var app = new Wa();
app.use(function(wa){
    wa.res.statusCode = 200;
    wa.res.setHeader('Content-Type','text/html');
    wa.res.end('<h1>Hello World!</h1>');
});
app.listen(8080);

和我们之前的例子,效果是一样的。
这一篇就到这吧,下一篇写一个中间件用于路由。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值