网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
const http = require('http');
// 创建一个web服务器
const server = http.createServer((req, res) => {
// request对象中封装了客户端给我们服务器传递过来的所有信息
console.log(req.url);
console.log(req.method);
console.log(req.headers);
res.end("Hello Server");
});
// 启动服务器,并且制定端口号和主机
server.listen(8888, '0.0.0.0', () => {
console.log("服务器启动成功~");
});
URL的处理
客户端在发送请求时,会请求不同的数据,那么会传入不同的请求地址:
- 比如
http://localhost:8000/login
; - 比如
http://localhost:8000/products
;
服务器端需要根据不同的请求地址,作出不同的响应:
const server = http.createServer((req, res) => {
const url = req.url;
console.log(url);
if (url === '/login') {
res.end("welcome Back~");
} else if (url === '/products') {
res.end("products");
} else {
res.end("error message");
}
});
那么如果用户发送的地址中还携带一些额外的参数呢?
http://localhost:8000/login?name=why&password=123
;- 这个时候,url的值是
/login?name=why&password=123
;
我们如何对它进行解析呢?
- 使用内置模块url(URL模块的使用在下方)
http发送网络请求
http.get("http://localhost:8000", (res) => {
res.on('data', data => {
console.log(data.toString());
console.log(JSON.parse(data.toString()));
})
});
发送post请求:
const req = http.request({
method: 'POST',
hostname: "localhost",
port: 8000
}, (res) => {
res.on('data', data => {
console.log(data.toString());
console.log(JSON.parse(data.toString()));
})
})
req.on('error', err => {
console.log(err);
})
req.end();
内置url模块
url模块的使用 | 说明 |
---|---|
url.parse() | 解析 url(第二个参数为true,可以将 query 里面的数据转换为对象) |
url.format(urlObject) | 是上面 url.parse() 操作的逆向操作 |
url.resolve(from,to) | 添加或者替换地址 |
URL包含的属性
const url = require('url');
// 解析请求
const parseInfo = url.parse(req.url);
console.log(parseInfo);
解析结果:
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?name=why&password=123',
query: 'name=why&password=123',
pathname: '/login',
path: '/login?name=why&password=123',
href: '/login?name=why&password=123'
}
获取query参数
const url=require('url');
var api='http://www.itying.com?name=zhangsan&age=20';
// console.log(url.parse(api,true));
var getValue=url.parse(api,true).query;
console.log(getValue);
console.log(`姓名:${getValue.name}--年龄:${getValue.age}`);
使用querystring内置模块
除了上面的获取参数的方式,我们也可以使用querystring内置模块
const { pathname, query } = url.parse(req.url);
const queryObj = qs.parse(query);
console.log(queryObj.name);
console.log(queryObj.password);
内置fs模块
三种操作方式
Node文件系统的API非常的多
- 我们不可能,也没必要一个个去学习;
- 这个更多的应该是作为一个API查询的手册,等用到的时候查询即可;
- 学习阶段我们只需要学习最常用的即可;
但是这些API大多数都提供三种操作方式:
- 方式一:同步操作文件:代码会被阻塞,不会继续执行;
- 方式二:异步回调函数操作文件:代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行;
- 方式三:异步Promise操作文件:代码不会被阻塞,通过
fs.promises
调用方法操作,会返回一个Promise,可以通过then、catch进行处理;
我们这里以获取一个文件的状态为例:
- 注意:都需要引入
fs
模块;
方式一:同步操作文件
// 1.方式一: 同步读取文件
const state = fs.statSync('../foo.txt');
console.log(state);
console.log('后续代码执行');
方式二:异步回调函数操作文件
// 2.方式二: 异步读取
fs.stat("../foo.txt", (err, state) => {
if (err) {
console.log(err);
return;
}
console.log(state);
})
console.log("后续代码执行");
方式三:异步Promise操作文件
// 3.方式三: Promise方式
fs.promises.stat("../foo.txt").then(state => {
console.log(state);
}).catch(err => {
console.log(err);
})
console.log("后续代码执行");
常用API
stat()
每个文件都带有一组详细信息,可以使用 Node.js 进行检查。
具体地说,使用 fs
模块提供的 stat()
方法。
const fs = require('fs')
fs.stat('/Users/joe/test.txt', (err, stats) => {
if (err) {
console.error(err)
return
}
stats.isFile() //true
stats.isDirectory() //false
stats.isSymbolicLink() //false
stats.size //1024000 //= 1MB
})
- 使用
stats.isFile()
和stats.isDirectory()
判断文件是否目录或文件。 - 使用
stats.isSymbolicLink()
判断文件是否符号链接。 - 使用
stats.size
获取文件的大小(以字节为单位)。
readFile()
const fs = require('fs')
fs.readFile('/Users/joe/test.txt', 'utf8' , (err, data) => {
if (err) {
console.error(err)
return
}
console.log(data)
})
另外,也可以使用同步的版本 fs.readFileSync()
:
const fs = require('fs')
try {
const data = fs.readFileSync('/Users/joe/test.txt', 'utf8')
console.log(data)
} catch (err) {
console.error(err)
}
fs.writeFile()
const fs = require('fs')
const content = '一些内容'
fs.writeFile('/Users/joe/test.txt', content, err => {
if (err) {
console.error(err)
return
}
//文件写入成功。
})
另外,也可以使用同步的版本 fs.writeFileSync()
:
const fs = require('fs')
const content = '一些内容'
try {
const data = fs.writeFileSync('/Users/joe/test.txt', content)
//文件写入成功。
} catch (err) {
console.error(err)
}
默认情况下,此 API 会替换文件的内容(如果文件已经存在)。
可以通过指定标志来修改默认的行为:
fs.writeFile('/Users/joe/test.txt', content, { flag: 'a+' }, err => {})
可能会使用的标志有:
r+
打开文件用于读写。w+
打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。a
打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。a+
打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。
fs.appendFile()
将内容追加到文件末尾的便捷方法是 fs.appendFile()
(及其对应的 fs.appendFileSync()
):
const content = '一些内容'
fs.appendFile('file.log', content, err => {
if (err) {
console.error(err)
return
}
//完成!
})
fs.mkdir()
使用 fs.mkdir()
或 fs.mkdirSync()
可以创建新的文件夹。
const fs = require('fs')
const folderName = '/Users/joe/test'
try {
if (!fs.existsSync(folderName)) {
fs.mkdirSync(folderName)
![img](https://img-blog.csdnimg.cn/img_convert/270c3c2b3178b197a7b116c7afba1769.png)
![img](https://img-blog.csdnimg.cn/img_convert/7ce0f9bb9dd8da86b32c2c0d0734e43f.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
= require('fs')
const folderName = '/Users/joe/test'
try {
if (!fs.existsSync(folderName)) {
fs.mkdirSync(folderName)
[外链图片转存中...(img-bSoZ3uBa-1715814971005)]
[外链图片转存中...(img-odEfv5Df-1715814971005)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**