一、Http模块和Url模块
1.简单的http服务
// 用node构建一个web服务器:http模块
// http这个模块的职责就是帮你创建编写服务器的
// 1.加载http服务器
var http = require('http');
// 2.使用http.createServer()方法创一个web服务器
// 返回一个Server实例
var server = http.createServer();
// 3.服务器要干嘛?
// 提供服务:对数据的服务
// 发请求
// 接受请求
// 处理请求
// 给个反馈(发送响应)
// 注册request请求事件
// 当客户端请求过来,就会自动触发服务器的request请求事件,然后执行第二个参数:回调处理。
server.on('request',function () {
console.log('收到客户端的请求了。');
})
// 4.绑定端口号,启动服务器
server.listen(3000,function () {
console.log('服务器启动成功,可以通过http://127.0.0.1.3000/')
})
2.发送响应
var http = require('http');
// 创建一个服务,里面传入一个方法,其中有两个参数:request获取url传过来的信息,response给浏览器响应信息。
http.createServer(function (request, response) {
// 设置响应头
// 状态码:200;文件类型:html;字符集:utf8
response.writeHead(200, { 'Content-Type': 'text/plain' });
// 表示页面上面输出一句话并且结束响应
console.log('收到客户端的请求了,请求路径是:' + request.url);
response.end('Hello nodejs');
}).listen(8081); //端口
console.log('Server running at http://127.0.0.1:8081/');
3.案例
我们希望当请求不同路径的时候响应不同的结果
var http = require('http');
http.createServer(function (request, response) {
// console.log('收到客户端的请求了,请求路径是:' + request.url);
// response.write('Hello');
// 上面的方法比较麻烦,推荐使用更简单的方式,直接end的同时发送响应数据
// response.end('HELLO nodejs')
// 根据不同的请求路径发送不同的响应结果
// 1、获取请求路径
// req.url获取到的端口号之后的那一部分路径,也就是说所有的url都是以/开头的
// 2、判断路径处理响应
var url=request.url;
if(url==='/')
{
response.end('index page');
}
else if(url==='/login')
{
response.end('login');
}
else{
response.end('404 NOT FOUND');
}
}).listen(3000,function () {
console.log('Server running at http://127.0.0.1:3000/');
}); //端口
二、核心模块
Node为JavaScript 提供了很多p务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了。
例如文件操作的fs核心模块,http服务构建的http模块,path路径操作模块、os操作系统信息模块……
var fs = require('fs')
三、模块系统
在node中 没有全局作用域,只有模块作用域。
简单来说外部访问不到内部,内部也访问不到外部
//a.js
var foo='aaa'
require('./b.js')
console.log('foo的值是:',foo)//aaa
//b.js
console.log('b.js文件被加载执行了。')
var foo='bbb'
既然是模块作用域 那么如何让模块与模块之间进行通信?
require方法有两个作用:
1.加载文件模块并执行里面的代码
2.拿到被加载文件模块导出的接口对象
在每个文件模块中都提供了一个对象:exports进行挂载。
//a.js
// exports默认是一个空对象
var ret = require('./b')
console.log(ret)//{ foo: 'hello', add: [Function (anonymous)] }
console.log(ret.add(1,2))//3
//b.js
var foo = 'bbb'
exports.foo = 'hello'
exports.add = function (x, y) {
return x + y
}
function add(x, y) {//此方法不会被a.js调用
return x - y
}
三、fs模块
1.对文件夹的操作
const fs= require('fs')
// 创建一个文件夹用mkdir()方法
// 第一个参数为 文件夹的名字,第二个参数为 回调函数 错误优先
fs.mkdir('logs',(err)=>{
if(err)throw err
console.log('文件夹创建成功')
})
// rename()方法可用于修改文件夹或文件的名字
// 第一个参数为 修改之前的文件夹路径,第二个参数为 修改之后的文件夹路径 第三个参数为回调函数
fs.rename('./logs','./log',(err)=>{
if(err)throw err
console.log('文件夹名字修改成功')
})
// rmdir()方法用于删除文件夹
// 第一个参数为 文件夹路径 第二个参数为回调函数
fs.rmdir('./log',()=>{
console.log('文件夹删除成功')
})
// readdir()方法用于读取文件夹
// readFile()方法用于读取文件
fs.readdir('./logs',(err,result)=>{
console.log(result)
})
2.对文件的操作
// writeFile()用于写文件 彻底覆盖
// appendFile()用于追加文件 不会覆盖原来的文件内容
// 第一个参数为 文件地址,第二个参数为 写入的内容,第三个参数为错误优先的回调函数
fs.writeFile('./logs/log1.log','hello \n world',(err)=>{
console.log('写文件成功')
})
fs.appendFile('./logs/log1.log','hello \n world!!!!!!!!!!',(err)=>{
console.log('追加文件成功')
})
// unlink()用于删除文件
fs.unlink('./logs/log1.log',(err)=>{
console.log('文件删除成功')
})
// readFile()用于读文件
// 第一个参数为文件路径,第二个参数为编码格式,第三个参数为回调
//若不加编码格式,content的返回值为: <Buffer 68 65 6c 6c 6f 20 0a 20 77 6f 72 6c 64>
// 方法一:此时要在参数中加入utf-8
fs.readFile('./logs/log1.log','utf-8',(err,content)=>{
console.log(content)
})
// 方法二:toString()方法变为字符串
fs.readFile('./logs/log1.log',(err,content)=>{
console.log(content.toString())
})
console.log('countinue1……')//最先出来
// 循环遍历目录
//1.创建目录
// for(var i=0;i<10;i++){
// fs.writeFile(`./logs/log-${i}.log`,`log-${i}`,(err)=>{
// console.log('done')
// })
// }
//2.读取目录
function readDir(dir) {
fs.readdir(dir, (err, content) => {
// console.log(content)
content.forEach((value, index) => {
let joinDir = `${dir}/${value}`
// console.log(index, value)
fs.stat(joinDir, (err, stats) => {
if (stats.isDirectory()) {
readDir(joinDir)
} else {
fs.readFile(joinDir,(err,content)=>{
console.log(content.toString())
})
}
})
})
})
}
readDir('./logs')
// 4.watch()方法 监测文件变化
fs.watch('./logs/log-0.log',(err)=>{
console.log('文件已改变')
})
3.异步方法
引例:
fs.readFile('./logs/log1.log',(err,content)=>{
console.log(content.toString())
})
console.log('countinue1……')//最先出来
// 将上面的异步方法改为同步方法:
const content = fs.readFileSync('./logs/log1.log')
console.log(content.toString())
console.log('countinue2……')//之后出来
const fsPromises = require('fs').promises
// 加分号的场景:小括号、中括号作为语句的第一行
; (async () => {
let result = await fsPromises.readFile('./logs/log1.log')
console.log(result.toString())
})()
四、sream模块和zlib
const fs = require('fs')
const zlib = require('zlib')
const gzip = zlib.createGzip()
const readstream = fs.createReadStream('./logs.txt')
const writestream = fs.createWriteStream('./logs.gzip')
readstream
.pipe(gzip)
.pipe(writestream)
// writestream.write(readstream)
五、readline模块
const readline = require('readline')
const rl = readline.createInterface({
input:process.stdin,
output:process.stdout
});
rl.question('你如何看待Node.js中文网?',(answer)=>{
console.log(`感谢您的宝贵意见:${answer}`)
rl.close()
})
六、crypto加密模块
const crypto = require('crypto')
const password = 'abc123'
// sha1加密算法 还可以选取md5加密算法
// digest() 为计算传入的所有数据的摘要值,其参数是编码方式,可以有 'hex'、'binary'或者'base64'
const hash = crypto
.createHash('sha1')
.update(password)
.digest('hex')
console.log(hash)