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')
补充小例子注意的点
- 用户在地址栏中输入的地址只是一个字符,不能直接做为访问的数据,服务器端响应的内容主要是根据程序来决定的
- 为防止用户在地址栏在输入localhost:3000,此时服务器端响应的为404,但照顾到用户体验感,应该返回主页面,所以增加了
- 对于下面这两段代码
虽然在我们现在使用的高级浏览器中不会出现什么问题,但若是低级浏览器中还是会报错,为确保程序的运行,所以我们在编程中可以带上(使用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的区别
- 同步API可以从返回值中拿到API执行的结果,但是异步API是不可以的
- 同步API从上到下依次执行,前面代码会阻塞后面代码的执行;异步API不会等待API执行完成后再向下执行代码