您的位置:首页 > Web前端 > Node.js

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

2017-11-22 19:20 816 查看
闲来无事,打算深入学习一下Node.js。之前虽说已有过一点Node.js的开发经验,但对Node.js还仅仅局限于了解,很多Node模块也没有比较深入的学习,如文件模块(fs)、http模块、path模块等。

到目前为止也用过两个Node的web框架(express和koa.js),也已经用koa.js搭建了一个完整的web项目。

借着现在这个机会正好深入学习下Node,所以根据自己的理解开始搭建一个web框架吧,也好巩固一下一些基础知识,对于这个框架,我想暂且将至命名为wa.js。

每日一更,借着写博客好好鞭策一下自己。

进入正文。

/[b]****************[/b]华丽丽的分割线[b]**********************[/b]/

一个最简单的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是项目入口文件

接下来我们将上面写的简单服务器的例子放
a349
到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);


和我们之前的例子,效果是一样的。

这一篇就到这吧,下一篇写一个中间件用于路由。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: