一、http模块
1. 服务器搭建
创建web服务器
// 引用系统模块
const http = require('http');
// 创建web服务器
const app = http.createServer();
// 当客户端发送请求的时候
app.on('request', (req, res) => {
// 响应
res.end('<h1>hi, user</h1>');
});
// 监听3000端口
app.listen(3000);
console.log('服务器已启动,监听3000端口,请访问 localhost:3000')
req: request对象,包含了所有的请求信息
res: response对象,包含了响应信息
2. 请求对象
request对象 包含了所有与请求相关的信息
url: 端口后的所有内容 :资源路径、查询字符串…
method: 请求方式
- 请求地址
app.on('request', (req, res) => {
req.headers // 获取请求报文
req.url // 获取请求地址
req.method // 获取请求方法
});
3. 响应对象
- HTTP状态码
- 200 请求成功
- 404 请求的资源没有被找到
- 500 服务器端错误
- 400 客户端请求有语法错误
- MIME类型
- text/html
- text/css
- application/javascript
- image/jpeg
- application/json
- …
app.on('request', (req, res) => {
// 设置响应报文
res.writeHead(200, {'Content-Type': 'text/html;charset=utf8'});
res.setHeader('Content-Type', 'text/html;charset=utf8');
//以上两种方式都可以设置响应报文
});
4. 路由
路由是指客户端请求地址与服务器端程序代码的对应关系。简单的说,就是请求什么响应什么。
比如:
http://localhost:3000/index
http://localhost:3000/login
// 当客户端发来请求的时候
app.on('request', (req, res) => {
// 获取客户端的请求路径
let { pathname } = url.parse(req.url);
if (pathname == '/' || pathname == '/index') {
res.end('欢迎来到首页');
} else if (pathname == '/list') {
res.end('欢迎来到列表页页');
} else {
res.end('抱歉, 您访问的页面出游了');
}
});
5. get和post请求
由于get和post请求的数据提交方式是不一样的,
get:在地址中提交数据
post:请求体中提交数据
后端通过request.mehtod属性来判断是哪种请求,在解析两种请求的时候方案也是不一致的
get: 在请求对象的属性中直接获取(res.url)
post: 需要通过事件监听机制来完成数据的接收,监听 data和end事件
6.静态资源和动态资源
静态资源: 服务器端不需要处理,可以直接响应给客户端的资源就是静态资源,例如CSS、JavaScript、image文件。
动态资源:相同的请求地址不同的响应资源,这种资源就是动态资源。
静态资源的处理,其实和路由的配置非常相似,只不过静态资源都有指定的目录和特殊的后缀,简单处理如下:
也可以使用第三方插件mime,使用npm install mime 安装
其中有个getType(path),返回mime类型
let ext = path.extname(req.url); //获取请求路径的后缀
let basename = path.basename(req.url); //获取路径中文件的名称
switch (ext) {
case ".css":
buf = fs.readFileSync(`./public/css/${basename}`);
break;
case ".js":
buf = fs.readFileSync(`./public/js/${basename}`);
break;
case ".jpg":
case ".png":
case ".gif":
case ".bmp":
buf = fs.readFileSync(`./public/image/${basename}`);
break;
}
二、url模块
将请求字符串抓换为对象
let obj=url.parse(str);//将请求字符串转换为对象
let obj=url.parse(str,true);//参数二为true ,将查询字符串转换为对象querystring
console.log(obj.protocol);//协议
console.log(obj.hostname);//主机名
console.log(obj.port);//端口号
console.log(obj.pathname);//资源路径
console.log(obj.query);//查询字符串
let {username,pwd}=url.parse(str,true).query;
// console.log(obj);
console.log(username,pwd);
- querystring模块
将查询字符串---->对象
//查询字符串
let str='uername=jack&pwd=123';
let obj=qs.parse(str);
三、path模块
方法 | 描述 |
---|---|
join(path1,path2) | 拼接路径 |
extname(path) | 获取路径后缀名e:.js、.css … |
basename(path) | 获取最后一个文件或者目录 |
dirname | 获取上一级目录 |
isAbsoute(path) | 判断是否为绝对路径 是为true |
resolve(path) | 把相对路径转化为绝对路径 |
四、fs模块(文件模块)
方法 | 描述 |
---|---|
mkdir(path,call) | 只能创建单层目录,不能嵌套 |
rmdir(path) | 删除单层空文件夹 |
readdir(path,callback) | 读取文件,返回一个数组 |
exists(path) | 判断路径是否存在 |
stat(path,callback) | 用于读取文件的状态 |
关于stat用法详细介绍
/*
callback有两个参数;err,stats;stats是一个fs.Stats对象;如果发生错误err.code是常见错误之一;
不建议在调用 fs.open() 、fs.readFile() 或 fs.writeFile() 之前使用 fs.stat() 检查一个文件是否存在。 作为替代,用户代码应该直接打开/读取/写入文件,当文件无效时再处理错误。
如果要检查一个文件是否存在且不操作它,推荐使用 fs.access()。
*/
fs.stat("./wenjian.txt",function(err,stats){
console.log(err);
console.log(stats);
// 获取文件的大小;
console.log(stats.size);
// 获取文件最后一次访问的时间;
console.log(stats.atime.toLocaleString());
// 文件创建的时间;
console.log(stats.birthtime.toLocaleString());
// 文件最后一次修改时间;
console.log(stats.mtime.toLocaleString());
// 状态发生变化的时间;
console.log(stats.ctime.toLocaleString())
//判断是否是目录;是返回true;不是返回false;
console.log(stats.isFile())
// 判断是否是文件;是返回true、不是返回false;
console.log(stats.isDirectory())