2021-07-22 POST请求参数 + 同步/异步API

本文介绍了如何处理Node.js中的POST请求参数,包括使用data和end事件,以及querystring模块。此外,文章还探讨了路由的基本概念,并通过实例解释了同步API和异步API的区别。在同步API中,代码按顺序执行,而在异步API中,通过回调函数实现非阻塞执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021/7/22
前面学习了get请求参数,今天补上没看的post参数吧

一、post 请求参数

  • 参数被放置在请求体中(也就是报文中)进行传输
  • 获取POST参数需要使用data事件和end事件
  • 使用querystring系统模块将参数转换为对象格式
//用于创建网站服务器的模块
const http = require('http');
//app对象就是网站服务器对象
const app = http.createServer();
//系统模块将参数转换为对象格式
const querystring = require('querystring');

// 当客户端发送请求的时候
app.on('request', (req, res) => {

    //post参数是通过事件的方式接收的
    //data  当请求参数传递的时候发出data事件
    //end 当参数传递完成的时候发出end事件
    let postParams = '';
    
    //监听参数传输事件
    req.on('data', params => {
        postParams += params;
    });
    //监听参数传输完毕事件
    req.on('end', () => {
        console.log(querystring.parse(postParams));
    });
    res.end('OK');
});

// 监听3000端口
app.listen(3000);
console.log('服务器已启动,监听3000端口,请访问 localhost:3000')

nodemon post.js 结果如下
请添加图片描述


二、 路由

简单来就就是客户机端请求与服务器端响应能够做到一一对应,例如当客户机端请求一张图片时,服务器端就响应一张图片;若请求一个页面则响应一个页面。

总结小例子

以一个静态资源的例子来对这两天的学习做一个练习

//用于创建网站服务器的模块
const http = require('http');
const url = require('url');
const path = require('path');
const fs = require('fs');
const mime = require('mime');

//app对象就是网站服务器对象
const app = http.createServer();


// 当客户端发送请求的时候
app.on('request', (req, res) => {
    //获取用户的请求路径
    let pathname = url.parse(req.url).pathname;
    //为解决localhost:3000返回当前首页而设置
    pathname = pathname == '/' ? '/default.html' : pathname;
    //将用户的请求路径转换为实际的服务器硬盘路径
    let realPath = path.join(__dirname, 'public' + pathname);

    //mime模块下的getType可以获取到请求参数的类型
    let type = mime.getType(realPath);
   
    fs.readFile(realPath, (error, result) => {
        //如果文件读取失败
        if (error != null) {
            res.writeHead(404, {
                'content-type': 'text/html;charset=utf8'
            })
            res.end('文件读取失败')
            return;
        }
        res.writeHead(200, {
            'content-type': type
        })
        res.end(result);
    })
});

// 监听3000端口
app.listen(3000);
console.log('服务器已启动,监听3000端口,请访问 localhost:3000')

补充小例子注意的点

  1. 用户在地址栏中输入的地址只是一个字符,不能直接做为访问的数据,服务器端响应的内容主要是根据程序来决定的
  2. 为防止用户在地址栏在输入localhost:3000,此时服务器端响应的为404,但照顾到用户体验感,应该返回主页面,所以增加了请添加图片描述
  3. 对于下面这两段代码
    请添加图片描述请添加图片描述

虽然在我们现在使用的高级浏览器中不会出现什么问题,但若是低级浏览器中还是会报错,为确保程序的运行,所以我们在编程中可以带上(使用mine模块之前需要安装,以及调用请添加图片描述

同步API 和 异步API

1.同步API

我理解的同步API就是程序可能一行一行的往下执行,就是前一行代码执行结果,才可能执行后面的代码

//同步
function getMsg() {
	setTimeout(function () {
		return {
			msg: 'hello node.js'
		}
	}, 2000)
	//虽然没有声明getMsg函数的返回值return,但默认返回undefine
}

const msg = getMsg();
console.log(msg);

结果如下,同步API中代码只能从上往下执行
请添加图片描述

2. 异步API

1)异步API通过回调函数来完成返回值
2)回调函数就是自己定义的函数让别人去调用
如:

//getData函数定义
function getData(callback) {}
//getData函数调用
getData( () => {} )

3)上述同步API中,当完成const msg = getMsg();时,虽然函数没有返回值,但是会默认返回undefind。我对上述的代码做出调整,使其成为一个异步API,如下:

function getMsg(callback) {
	setTimeout(function () {
	//javascript可以实现一个函数的参数是另一个函数,所以此时调用callback()其实就是在调用function(data) {},实现了异步API
		callback( {
			msg: 'hello node.js'
		})
	}, 2000)
}
getMsg(function (data) {
	console.log(data);
});

3. 同步API的区别

  1. 同步API可以从返回值中拿到API执行的结果,但是异步API是不可以的
  2. 同步API从上到下依次执行,前面代码会阻塞后面代码的执行;异步API不会等待API执行完成后再向下执行代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值