HTTP核心模块

1. HTTP协议

  • 请求报文
  • 响应报文

2. HTTP模块

  • 使用之前的方式拼接响应报文
let msg = "<h1>hello world</h1>";
//构造响应报文
let responseText = "HTTP/1.1 200 OK\r\n";
responseText += "Server: mynodeserver 1.0\r\n";
responseText += "Content-Length:"+ msg.length +"\r\n";
responseText += "Content-Type: text/html;charset=utf-8\r\n";
responseText += "\r\n";
responseText += msg;

socket.write(responseText);
socket.end();
  • 使用http模块简化web服务器的开发
"use strict";
const http = require("http");
let server = http.createServer((req,res)=>{

    //获取请求头      req.headers
    //获取http的版本  req.httpVersion
    //请求的方法      req.method
    //请求的路径      req.url
    console.log(req.headers);
    console.log(req.httpVersion);
    console.log(req.method);
    console.log(req.url);

    res.write("hhhhhh中文");
    res.end();
}).listen(8888,()=>{
    console.log("开始监听...");
});
  • 请求对象的常用属性

    • req.headers 获取请求头
    • req.method 请求的方法
    • req.httpVersion 获取http的版本
    • req.url 请求的路径
  • 响应对象的常用方法

    • res.end() 结束请求
    • res.write() 发送内容
    • res.setHeader("Content-Type","text/html;charset=utf-8");
  • 异常处理

请求会有很多很多,如果一个请求出错会导致服务器挂掉,别的请求无法访问服务器.
所以再做服务器开发的时候要保证如果一个请求出错,不影响其他请求

如何处理异常:
try{

}catch(err){
    console.log("出错了:" + err);
    //此处要写日志,让程序员发现错误,进行修改
}
  • 实现自己的模板,改变页面数据
const http = require("http");
const fs= require("fs");
const  path = require("path");

let server = http.createServer((req,res)=>{

    if(req.url.trim() === "/" || req.url.includes("index.html")) {
        //读取模板html文件
        fs.readFile("./template/tmp.html", (err, content)=>{
            let tmp = content.toString();

            let dataArr = require("./data.json");

            //变量数据,替换模板
            let array = [];
            for (var i = 0; i < dataArr.length; i++) {
                let item = dataArr[i];

                array.push("<li>"+item+"</li>");
            }
            tmp = tmp.replace("${list}",array.join(""));

            tmp = tmp.replace("${title}","列表");
            res.write(tmp);
            //结束请求
            res.end();
        });
    }else if(req.url.includes(".css")){

        //加载css
        fs.readFile(path.join("template",req.url) ,(err,content)=>{
            res.setHeader("Content-Type","text/css;charset=utf8");
            res.end(content);
        });

    }else if(req.url.includes(".jpg")) {
        //加载jpg的图片
        fs.readFile(path.join("image",req.url) ,(err,content)=>{
            res.setHeader("Content-Type","image/jpeg");
            res.end(content);
        });
    }else{
        res.end("你闹啥呢");
    }



}).listen(8888,()=>{
    console.log("开启监听...");
});

3. xtpl模板的使用

var xtpl = require('xtpl');
xtpl.renderFile('./x.xtpl',{
    x:1
},function(error,content){

});
  • 音乐播放器

4. Express第三方框架

  • 中文文档

  • express的安装

    • npm install express
  • 基本使用

  • 代码结构

    "use strict";
    const express = require("express");
    let app = express();
    app.get("/", (req,res)=>{
      res.setHeader("Content-Type","text/html;charset=utf8");
      res.write("我的天哪");
      res.end();
    });
    app.listen(8888,()=>{
      console.log("开始监听...");
    });
    
  • express的get
    app.get("/", (req, res) => {
        res.setHeader("Content-Type", "text/html;charset=utf-8");
        res.write("欢迎");
        res.end();
    });
    app.get("/photo", (req, res) => {
        res.write("<h1>没有照片</h1>");
        res.end();
    });
  • express的get获取参数 方式1
//请求地址的形式  http://127.0.0.1:8888/post?id=1&token=abcd
app.get("/post", (req, res) => {
//解析url中的参数 方式1
//let query = url.parse(req.url, true).query;
//console.log(query.id);
//console.log(query.token);

//解析url中的参数 方式2
//console.log(req.query);
//console.log(req.query.id);
////过期的方法,不推荐使用
//console.log(req.param("id"));
res.write("ceshi");
res.end();
});
  • express的get获取参数 方式2
//请求地址的形式  http://127.0.0.1:8888/zs/1002.html
app.get("/:username/:id.html", (req, res) => {
    //获取参数
    console.log(req.params);
    console.log(req.params.username);
    res.send("haha");
});
  • express的通配符,next跳到下一个路由
//优先跟注册地址注册的顺序有关
app.get("/*", (req, res, next) => {
    res.setHeader("Content-Type", "text/html;charset=utf-8");
    res.write("通配符哈<br>");
    next();
});
  • express的post和all
  • send方法
  • 简化读取静态文件
//app.use(express.static("template"));
app.use("/public", express.static("template"));
  • 路由router
"use strict";

const express = require("express");

let app = express();

let mainRouter = express.Router();

mainRouter.get("/main/list", (req, res) => {
    res.end("/main/list");
});

mainRouter.get("/main/haha", (req, res) => {
    res.end("/main/haha");
});

app.use("/", mainRouter);

app.listen(8888, ()=>{
    console.log("正在加载...");
});
  • 把不同功能的router放到不同的位置
  • 重做音乐播放器
posted @ 2016-11-07 21:33  彼此丶  阅读(1022)  评论(0编辑  收藏  举报