闲来无事,打算深入学习一下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.创建一个服务器,并传入监听函数。当有请求到来时便会执行这个函数并且将request
和response
作为参数传入
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);
和我们之前的例子,效果是一样的。
这一篇就到这吧,下一篇写一个中间件用于路由。