首先创建一个 HTTP 服务器.
- var http = require('http');
- function serve(request,response) {
- console.log(request.method); // 请求的方法
- console.log(request.url); // 请求里的 url, 只含有路径名, 并不是完整的 url
- console.log(request.header) // 获取请求头
- response.statusCode = 200;
- // 设置响应类型, 编码为 utf-8.
- // 服务器返回资源给浏览器时, 还应该告诉浏览器这是什么类型的文件, 以什么方式解析. 不指定的话可能会造成乱码
- response.setHeader('Content-Type','text/html;charset=utf-8');
- response.setHeader('name','zfpx');
- response.write(new Date().toString());
- response.end();
- }
- var server = http.createServer(serve);
- server.listen(3000);
如果我们希望读取其他文件的内容, 则需要先导入 fs 模块, 该模块是读取文件的模块.
- var fs = require('fs');
- function serve(request,response) {
- var url = request.url;// 设置响应类型, 编码为 utf-8.
- // 服务器返回资源给浏览器时, 还应该告诉浏览器这是什么类型的文件, 以什么方式解析
- response.setHeader('Content-Type','text/html;charset=utf-8');
- // 如果我们希望返回的是其他文件的内容, 则需要先读取其他文件, 这时需要 fs 模块来读取文件
- fs.readFile('index.html',function(err,data) {
- response.write(data);
- response.end();
- })
- }
但是这样又有一个问题, 就是: 在对返回的 HTML 代码开始解析时, 解析过程中如果遇到引用的服务器上的资源 (额外的 CSS,JS 代码, 图片等资源), 需要再次向服务器发送请求, 但是不管是发送什么请求, 服务器返回的都是 index.html 文件. 这时, 我们就需要对不同的请求资源做一个判断, 让其返回不同类型的资源.
- function serve(request,response) {
- var url = request.url;
- if (url == '/') {
- // 设置响应类型, 编码为 utf-8.
- // 服务器返回资源给浏览器时, 还应该告诉浏览器这是什么类型的文件, 以什么方式解析
- response.setHeader('Content-Type','text/html;charset=utf-8');
- // 如果我们希望返回的是其他文件的内容, 则需要先读取其他文件, 这时需要 fs 模块来读取文件
- fs.readFile('index.html',function(err,data) {
- response.write(data);
- response.end();
- })
- }else if (url == '/style.css') {
- response.setHeader('Content-Type','text/css;charset=utf-8');
- // 如果我们希望返回的是其他文件的内容, 则需要先读取其他文件, 这时需要 fs 模块来读取文件
- fs.readFile('style.css',function(err,data) {
- response.write(data);
- response.end();
- })
- }
一个页面里, 我们可能会请求非常多的静态资源, 如果每次都加一个 else if 显然让页面更复杂, 且不利于维护. 所以我们希望将所有的静态资源请求都封装在一个函数里.
- function parseMime(pathname) {
- var reg = /\.(HTML|JS|CSS|JSON|TXT|ICO|JPG)/i;
- if (reg.test(pathname)) {
- // 获取请求文件的后缀名
- var suffix = reg.exec(pathname)[1].toUpperCase();
- // 根据请求文件的后缀名获取到当前文件的 MIME 类型
- var suffixMIME = "text/plain";
- switch(suffix) {
- case "HTML":
- suffixMIME = "text/html";
- break;
- case "CSS":
- suffixMIME = "text/css";
- break;
- case "JS":
- suffixMIME = "text/javascript";
- break;
- case "JSON":
- suffixMIME = "application/json";
- break;
- case "ICO":
- suffixMIME = "application/octet-stream";
- break;
- case "JPG":
- suffixMIME = "image/jpg";
- break;
- }
- }
- return suffixMIME;
- }
实际上, Node 中还提供了一个第三方的模块能够自动帮我们判断文件的 MIME 类型, 我们这里还需要用到一个第三方的模块 "mine".
- var mime = require('mime');
- function serve(request,response) {
- var url = request.url;
- if (url == '/') {
- // 设置响应类型, 编码为 utf-8.
- // 服务器返回资源给浏览器时, 还应该告诉浏览器这是什么类型的文件, 以什么方式解析
- response.setHeader('Content-Type','text/html;charset=utf-8');
- // 如果我们希望返回的是其他文件的内容, 则需要先读取其他文件, 这时需要 fs 模块来读取文件
- fs.readFile('index.html',function(err,data) {
- response.write(data);
- response.end();
- })
- }else{
- static(url,response)
- }
- }
- function static(url,response) {
- response.setHeader('Content-Type',mime.lookup(url) + ';charset=utf-8');
- // 如果我们希望返回的是其他文件的内容, 则需要先读取其他文件, 这时需要 fs 模块来读取文件
- fs.readFile(url.slice(1),function(err,data) {
- response.write(data);
- response.end();
- })
- }
现在我们的 url 都是类似 http://localhost:3000/index.html 这样的, 就是客户端只是单纯的获取数据, 并不涉及向服务器端发送数据.
前面我们说过, request.url 获取的是'3000:'之后的内容, 那么当我们需要向服务器传一些内容的时候, 比如说 http://localhost:3000/index.html/?name="xiaoyu". 这时 request.url 获取的就是 / index.html/?name="xiaoyu".
这样的 url 显然不能再作为我们判断路径的依据, 所以我们得进一步处理这个 url. 其实 node 提供了一个更加强大的 url 解析库给我们, 这个库就是 "url". 这个库能够解析整个完整的 url 路径.
传送地址: url 模块学习小结
来源: https://www.cnblogs.com/yuliangbin/p/9429062.html