前言
js最早运行在浏览器==>浏览器提供js运行所需要的上下文
node.js允许js在后端运行(脱离浏览器)
node是一个运行时环境,是一个库
1. 一个完整的基于node的web应用
分析:
- 我们要提供web页面,所以要一个HTTP服务器;
- 请求的url不同,相应不同,所以要路由分发;
- 请求的参数需要处理,所以要数据处理功能;
- 需要对请求处理,所以要请求处理程序;
- 需要响应客户端;
1.1node内置模块http–构建服务器
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
代码分析
上述代码可以拆解为:
var http = require("http");
var server = http.createServer(onRequest)
server.listen(8888);
function onRequest(request, response){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
http调用了createServer方法,它接收了一个函数onRequest作为参数。
记一笔:上述代码体现了:基于事件驱动的回调。
我也不太懂,先记着叭!
1.2对请求进行路由
整理思路 :
不同的请求进来的时候我们给出不同的响应,也就是说上面的代码中的
response.write("Hello World");
将这个"Hello World"替换成自己想要的。也就是:
response.write(html);
那么问题来了,怎么替换?也就是怎么获得不同的html文本:
不急,慢慢来
- 获取请求路径
- 根据路径分发请求
- 找到路径对应的内容
- 处理请求
获取请求路径
借助nodejs内置模块url
var url = require("url");
//我们得到的请求的路径
var pathname = url.parse(request.url).pathname;
根据请求路径分发请求
我们假定有这么一个专门分发路径的对象handle,它的一个属性名对应一个路径,在它的属性中找不到的属性名(路径)就返回404。
handle的一个属性对应一个函数(这个函数返回上面说的我们想要的html文本),这些函数我们在requestHandlers.js模块中暴露出来
//index.js中,这里的后缀名我喜欢加上,可以不加
const requestHandlers = require(./requestHandlers.js)
var handle = {}
//handle对象的'/'属性对应requestHandlers.js中的index函数,以此类推
handle["/"] = requestHandlers.index;
handle["/page1"] = requestHandlers.page1;
handle["/page2"] = requestHandlers.page2;
//这里的requestHandlers中的代码也简略的贴一点,都是重复的,贴一个例子
//requestHandlers.js中
function index(){
return 'here is index page'
}
module.exports.index = index
找到路径对应的内容
这里的/page1、/page2就是请求的路径,然后不难得出我们想要的代码
handle[pathname] = requestHandlers.xxx //这里的xxx指代任意内容
也就是说我们需要执行器,将pathname和handle结合起来,并且返回一个html文本,或者说返回一个函数,让这个函数返回我们想要的内容,我们这里叫router叭
新建一个router.js
问题很简单了,
- 在首页启动服务器的时候,传入两个参数,router和handle;
- 启动服务器的时候拿到请求路径,交给路由;
- 路由根据路径从handle对象中找到相应的函数。找到就执行,找不到就404
处理请求
//接受pathname handle 返回html
let router = {
route: (pathname, handle)=> {
//我们前面说的一个路径(handle对象的一个属性)对应一个函数,判断一下,是函数就执行 ,不是函数(说明我们没有声明这个路径)就是404
if (typeof handle[pathname] === 'function'){
return handle[pathname]()
}else {
return '我丢!!! 404 not found'
}
}
}
module.exports = router