一、node
1、创建简单的web服务器
2、使用http模块(监听函数 参数: request 请求头 、 response 响应头)
3、监听服务器端口
4、设置服务器响应数据的格式
5、结束当前服务
const http = require('http')
let port = 8000;
let hostname = 'localhost';
const server = http.createServer((req, res) => {
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
// res.write("首页");
// res.end();
res.write("首页",(err)=>{
if(err)
throw err;
});
res.end();
});
server.listen(port,()=>{
console.log(`服务器运行在 http://${hostname}:${port}/`)
})
二、node.js文件系统
1、 文件读取
异步读取(readFile)
第一个参数为路径,第二个参数可写,可不写,不写即为默认,第三个为回调函数
//引入fs文件模块
const fs = require("fs");
const url = require("url");
const http = require('http')
let port = 8000;
let hostname = "localhost";
const server = http.createServer((req, res) => {
if (req.url != "/favicon.ico") {
res.setHeader("Content-Type", "text/html;charset=utf8");
try {
//文件读取(第一个参数为要读取的文件,第二个参数可不写,不写即为默认,第三个为回调函数)
//下面这个为异步读取
fs.readFile("./windy/null.txt",{flag:"r+",mode:0666},(err,str)=>{
if(err)
throw err;
//读取的值是buffer组所以要to String
res.write(str.toString());
res.end();
});
}
catch (error) {
throw error;
}
}
})
server.listen(port, () => {
console.log(`服务器运行在 http://${hostname}:${port}/`)
})
其中第二个参数的参数可以是以下值:
Flag | 描述 |
---|---|
r | 以读取模式打开文件。如果文件不存在抛出异常。 |
r+ | 以读写模式打开文件。如果文件不存在抛出异常。 |
rs | 以同步的方式读取文件。 |
rs+ | 以同步的方式读取和写入文件。 |
w | 以写入模式打开文件,如果文件不存在则创建。 |
wx | 类似 'w',但是如果文件路径存在,则文件写入失败。 |
w+ | 以读写模式打开文件,如果文件不存在则创建。 |
wx+ | 类似 'w+', 但是如果文件路径存在,则文件读写失败。 |
a | 以追加模式打开文件,如果文件不存在则创建。 |
ax | 类似 'a', 但是如果文件路径存在,则文件追加失败。 |
a+ | 以读取追加模式打开文件,如果文件不存在则创建。 |
ax+ | 类似 'a+', 但是如果文件路径存在,则文件读取追加失败。 |
同步读取 (readFileSync)
let str = fs.readFileSync("./windy/null.txt");
res.write(str.toString());
res.end();
以上二者的结果一致
结果:因为我在null.txt里写了“等风来”所以读取出来皆为“等风来”
2、文件打开
文件打开(open)
第一个参数为路径,第二个为回调函数
ps:下面这段代码还还是要套在try catch里,为了方便就只写该功能的代码
fs.open("./windy", (err, fd) => {
if (err) {
console.log("文件打开失败");
return
}
console.log("文件打开成功", fd);
});
res.end();
结果:
3、检测文件信息
检测文件信息
第一个参数为路径,第二个为回调函数
fs.stat("./windy", (err, stats) => {
if (err)
throw err;
console.log(stats.isFile());
console.log(stats.isDirectory());
});
结果:
4、面试小案例
面试案例:找出一个目录下所有的目录与文件
let baseurl = "./";
let basename = "windy";
let check = (base, name) => {
let src = base + name;
fs.stat(src, (err, stats) => {
if (err)
throw err;
if (stats.isDirectory()) {
console.log(name, "目录");
//目录
fs.open(src, (err, fd) => {
if (err)
throw err;
fs.readdir(src, (e, files) => {
if (e)
throw e;
for (let val of files) {
let url = src + "/";
check(url, val);
}
});
});
}
else {
//文件
console.log(name, "文件")
}
})
}
check(baseurl, basename);
res.end();
解析:
上图是我的各个文件位置图,结合代码观看可以方便理解。
1、首先定义一个基本路径,然后检测是否为目录。如果是,输出名字+目录两个字;如果不是直接走else输出名字+文件两个字
以下步骤针对于第一步是目录的情况下
2、接着打开目录(open)
3、读取目录(readdir),这里readdir有两个参数。第一个参数为文件路径,第二个为回调函数,而回调函数里又带有两个参数err,files,第一个为错误信息,第二个为目录下的文件数组列表。
4、读取完之后遍历该数组列表并对其进行递归
5、查找完成
结果:
5、文件写入
在文件写入之前应在文件前面加以下两句代码
let query = url.parse(req.url, true).query
let txt = query.content;
fs.writeFile("./windy/spring/cute.txt", txt, { flag: "w", mode: 0666 }, (err) => {
if (err) {
console.log("写入失败");
}
else {
console.log("写入成功!");
}
res.end();
});
结果:在打开的页面上加?content=....
然后去找你写入的文件就会看到有你编辑的东西,如下图