NodeJS

1. http

1.1 http状态码

分类 描述
1** 信息
2** 成功
3** 重定向
4** 客户端错误
5** 服务器错误

1.2 请求方式

  • GET 获取

    • 数据放在 url 里面传输的,容量 ≤ 32k
  • POST 发送数据

    • 容量大

2. 接收 GET 数据

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<form action="http://localhost:8080/aaa" method="GET">
			用户:<input type="text" name="username">
			密码:<input type="password" name="password">
			<input type="submit" id="" name="" value="提交"/>
		</form>
	</body>
</html>
const http = require('http');
const url = require('url');

let server = http.createServer((req, res) => {
   
	// 解析 GET 过来的数据
	// 添加参数 true,能将query参数也一起解析了
	let result = url.parse(req.url, true);
	let {
   query, pathname} = result;
	console.log(result);
	console.log(query,pathname);

});


server.listen(8080);

在这里插入图片描述

3. 原生处理 POST 数据

3.1 普通数据 —— querystring,url

const http = require('http');
const querystring = require('querystring');

let server = http.createServer((req, res) => {
   
    console.log(req.method); // POST
    let arr = [];
    // 当有数据
    req.on('data',(buffer) => {
   
        // console.log(buffer); // <Buffer 75 73 65 72 6e 61 6d 65 3d 61 64 6d 69 6e 26 70 61 73 73 77 6f 72 64 3d 31 32 33 33 32 31>
        arr.push(buffer);
    });

    // 数据结束
    req.on('end',() => {
   
        let buffer = Buffer.concat(arr);
        let post = querystring.parse(buffer.toString());
        console.log(post);
        // console.log(buffer.toString()); // <Buffer 75 73 65 72 6e 61 6d 65 3d 61 64 6d 69 6e 26 70 61 73 73 77 6f 72 64 3d 31 32 33 33 32 31>
    });
});


server.listen(8080);

在这里插入图片描述

3.2 文件数据 buffer

  • form上传文件,要添加 enctype='application/x-www-form-urlencoded',enctype 默认值为 application/x-www-form-urlencoded

     <form action="http://localhost:8080/upload" method="POST" enctype="multipart/form-data">
            用户: <input type="text" name="username"><br>
            密码: <input type="password" name="password"><br>
            <input type="file" name="f1"><br><br>
            <input type="submit">
    </form>
    
    const http = require('http');
    
    
    http.createServer((req, res) => {
         
        let  arr = [];
        console.log(req.headers);
        req.on('data',(buffer) => {
         
            arr.push(buffer);
        });
        req.on('end',() => {
         
            let buffer = Buffer.concat(arr);
    
            console.log(buffer.toString());
        });
    }).listen(8080);
    

    在这里插入图片描述

    结果:
    在这里插入图片描述
    注:在请求头中能获取到分隔符,注意横杠数

  • 在 buffer 中查找

    let buffer = new Buffer('abc\r\ndfadsa\r\ndfawfdsafdsa');
    
    console.log(buffer.indexOf('\r\n')); // 3
    
  • 切分方法封装

    let buffer = new Buffer('abc\r\ndfadsa\r\ndfawfdsafdsa');
    
    console.log(buffer.indexOf('\r\n')); // 3
    
    function bufferSplit(buffer, delimiter) {
         
        let arr = [];
        let n = 0;
    
        while ((n = buffer.indexOf(delimiter)) != -1) {
         
            arr.push(buffer.slice(0, n));
    
            buffer = buffer.slice(n + delimiter.length); //跳过分隔符长度
        }
        arr.push(buffer); // 将最后的一块添加进去
    
        return arr;
    };
    
    console.log(bufferSplit(buffer, '\r\n').map(a => a.toString()));
    

    在这里插入图片描述

  • 源码

    const http = require('http');
    const fs = require('fs');
    
    
    function bufferSplit(buffer, delimiter) {
         
        let arr = [];
        let n = 0;
    
        while ((n = buffer.indexOf(delimiter)) != -1) {
         
            arr.push(buffer.slice(0, n));
    
            buffer = buffer.slice(n + delimiter.length); //跳过分隔符长度
        }
        arr.push(buffer); // 将最后的一块添加进去
    
        return arr;
    };
    
    http.createServer((req, res) => {
         
        let arr = [];
        let boundary = '--' + req.headers['content-type'].split('; ')[1].split('=')[1]
    
        req.on('data', (buffer) => {
         
            arr.push(buffer);
        });
        req.on('end', () => {
         
            let buffer = Buffer.concat(arr);
    
            // 按照分隔符切分
            let result = bufferSplit(buffer, boundary);
    
            // 去掉头 null 和 尾 \r\n--
            result.pop();
            result.shift();
    
            // 针对其中的每一个处理
            result.forEach(buffer => {
         
                // 去掉 头尾的 \r\n
                buffer = buffer.slice(2, buffer.length - 2);
    
                // 使用 \r\n 切
                let n = buffer.indexOf('\r\n\r\n');
    
                let info = buffer.slice(0, n).toString();
                let data = buffer.slice(n + 4);
    
                // console.log(info.toString());
    
                if (info.indexOf('\r\n') != -1) {
         
                    // 文件
                    let result2 = info.split('\r\n')[0].split('; ');
                    let name = result2[1].split('=')[1];
                    let filename = result2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值