http模块
- 创建本地服务器
const http = require('http');
http.createServer(((req, res) => {
res.writeHead(200,{charset:'utf-8'})
res.write('hello')
res.end('world')
})).listen(3000,()=>{
console.log('运行成功')
})
createServer方法表示创建本地服务器,接受一个回调函数,该回调函数有两个参数,分别是请求对象和响应对象。响应的数据可以使用write方法和end方法发送,write方法可以使用多个,但是必须要使用一个end方法表示发送数据结束。
listen方法表示启用HTTP 服务器监听连接,第一个参数表示需要监听的端口号,第二个是监听成功的回调。
- 跨域
在响应头中加上
'Access-Control-Allow-Origin': '*'
res.writeHead(200, {
'content-type': 'application/json;charset=utf-8',
'Access-Control-Allow-Origin': '*'
})
- 获取请求内容
const http = require('http');
http.createServer(((req, res) => {
res.writeHead(200,{charset:'utf-8'})
let data
req.on('data', (chunk) => {
data += chunk
})
req.on('end', () => {
console.log(data)
})
res.write('hello')
res.end('world')
})).listen(3000,()=>{
console.log('运行成功')
})
-
模拟get
var http = require('http')
var https = require('https')
https.get(`https://m.lagou.com/listmore.json${url}`, (res) => {
res.on('data', (chunk) => {
data += chunk
})
res.on('end', () => {
response.end(JSON.stringify({
ret: true,
data
}))
})
})
需要注意的是,如果请求的地址使用的是https协议,则需要使用https模块发送请求
- 模拟post请求
const postData = querystring.stringify({
'msg': 'Hello World!'
});
const options = {
hostname: 'www.google.com',
port: 80,
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// 将数据写入请求正文
req.write(postData);
req.end();
url模块
- 解析url
const url = new URL('https://www.baidu.com:443/ad/index.html?id=8&name=mouse#tag=110')
// 获取传递参数
const path = url.searchParams
console.log(path)
// { 'id' => '8', 'name' => 'mouse' }
更多使用:
url 网址 | Node.js API 文档 (nodejs.cn)
event模块
用于事件发布和订阅的模块
const EventEmitter = require('events')
class MyEventEmitter extends EventEmitter {}
const event = new MyEventEmitter()
event.on('play', (movie) => {
console.log(movie)
})
event.emit('play', '我和我的祖国')
event.emit('play', '中国机长')
on()
方法用于注册监听器,emit()
方法用于触发事件。需要注意的是,如果注册了多个同名的监听器时,是不会发生覆盖的,触发该事件时所有的同名监听器都会被调用。
fs文件操作模块
const fs = require('fs')
// 创建文件夹
fs.mkdir('./logs', (err) => {
console.log('done.')
})
// 文件夹改名
fs.rename('./logs', './log', () => {
console.log('done')
})
// 删除文件夹
fs.rmdir('./log', () => {
console.log('done.')
})
// 写内容到文件里
fs.writeFile(
'./logs/log1.txt',
'hello',
// 错误优先的回调函数
(err) => {
if (err) {
console.log(err.message)
} else {
console.log('文件创建成功')
}
}
)
// 给文件追加内容
fs.appendFile('./logs/log1.txt', '\nworld', () => {
console.log('done.')
})
// 读取文件内容
fs.readFile('./logs/log1.txt', 'utf-8', (err, data) => {
console.log(data)
})
// 删除文件
fs.unlink('./logs/log1.txt', (err) => {
console.log('done.')
})
// 批量写文件
for (var i = 0; i < 10; i++) {
fs.writeFile(`./logs/log-${i}.txt`, `log-${i}`, (err) => {
console.log('done.')
})
}
// 读取文件/目录信息
fs.readdir('./', (err, data) => {
data.forEach((value, index) => {
fs.stat(`./${value}`, (err, stats) => {
// console.log(value + ':' + stats.size)
console.log(value + ' is ' + (stats.isDirectory() ? 'directory' : 'file'))
})
})
})
// 同步读取文件
try {
const content = fs.readFileSync('./logs/log-1.txt', 'utf-8')
console.log(content)
console.log(0)
} catch (e) {
console.log(e.message)
}
// 异步读取文件:方法一
fs.readFile('./logs/log-0.txt', 'utf-8', (err, content) => {
console.log(content)
console.log(0)
})
console.log(1)
// 异步读取文件:方法二
const fs = require("fs").promises
fs.readFile('./logs/log-0.txt', 'utf-8').then(result => {
console.log(result)
})
stream流模块
stream
是Node.js提供的又一个仅在服务区端可用的模块,目的是支持“流”这种数据结构。
const fs = require('fs')
const readstream = fs.createReadStream('./1.txt')
const writestream = fs.createWriteStream('./2.txt')
readstream.pipe(writestream)
zlib模块
const fs = require('fs')
const zlib = require('zlib')
const gzip = zlib.createGzip()
const readstream = fs.createReadStream('./note.txt')
const writestream = fs.createWriteStream('./note2.txt')
readstream
.pipe(gzip)
.pipe(writestream)
需要注意的是,如果需要返回该模式压缩过的文件时,响应头中需要添加
'content-encoding': 'gzip'
否则压缩过后的文件浏览器无法识别