1. http 模块
一个简单的服务器
const http = reqiue('http'); const server = http.createServer((req, res) => { console.log(req.url); // 请求 url console.log(req.method); //请求方法 console.log(req.headers); //请求头部 if(req.url === '/'){ // 设置响应的状态码和头部 res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); // 单独设置状态码 res.statusCode = 200; // 单独设置响应头部 res.setHeader('Content-Type', 'text/plain; charset=utf-8'); // Set-Cookie res.setHeader('Set-Cookie', 'name=song; secure'); // 设置响应体 res.write("Hello World"); res.write("!!!") // 发送响应报文 res.end(); } }) server.listen(3000, () => { console.log("服务器跑在 3000 端口"); })
设置静态目录
const http = reqiue('http'); const server = http.createServer((req, res) => { console.log(req.url); // 请求 url console.log(req.method); //请求方法 console.log(req.headers); //请求头部 if(req.url === '/'){ // 设置响应的状态码和头部 res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); // 单独设置状态码 res.statusCode = 200; // 单独设置响应头部 res.setHeader('Content-Type', 'text/plain; charset=utf-8'); // Set-Cookie res.setHeader('Set-Cookie', 'name=song; secure'); // 设置响应体 res.write("Hello World"); res.write("!!!") // 发送响应报文 res.end(); } else { let filePath = path.join(__dirname, 'static', url.pathname); try{ let file = await fs.readFileAsync(filePath); res.statusCode = 200; res.end(file); } catch(error){ res.statusCode = 404; res.end("404 Not Found"); } } // 或者 else { let fileName = url.pathname; let type; switch(fileName.substr(fileName.lastIndexOf('.') + 1)){ case 'css': type = 'text/css; charset=utf-8'; break; case 'js': type = 'text/javascript; charset=utf-8'; break; default: type = 'application/octet-stream'; break; } try{ let file = await fs.readFileAsync(`./static${url.pathname}`) res.writeHeader('Content-Type', 'type'); res.end(file); } catch{ res.writeHead(400, {'Content-Type': 'text/plain; charset=utf-8'}); res.end("404错误") } } }) server.listen(3000, () => { console.log("服务器跑在 3000 端口"); })
处理 post 请求(文件上传)
// 前端部分 let type = typeof data; let header; if(type === 'string'){ header = 'application/x-www-form-urlencoded'; } else if(data instanceof File || data instanceof FormData){ header = 'multipart/form-data; boundary=---xxxxxxxxxx'; } else { header = 'application/json'; data = JSON.stringify(data); } xhr.setRequestHeader('Content-Type', header); xhr.send(data); // 后端 const http = require('http'); const fs = require('fs'); const server = http.createServer((req, res) => { if(req.url === '/upload'){ let segment = []; req.on('data', chunk => { // chunk 为 Buffer 对象 // 字符串 aaa=bbb 对应的 Buffer 对象如下 // <Buffer 61 61 61 3d 62 62 62> segment.push(chunk); }) req.on('end', () => { // 文件上传代码 segment = Buffer.concat(segment); // 下方代码获取 Buffer 转成的字符串 // segment = Buffer.concat(segment).toString() fs.writeFile('fileName', segment, err => { res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); res.write('文件上传成功!'); res.end(); }) }) } }); server.listen(3000, () => { console.log('服务器跑在 3000 端口'); })
fs 模块
const fs = require('fs'); // readFile fs.readFile('./image.png', (err, buffer) => { if(err) throw err; }); // writeFile fs.writeFile('index.txt', 'hello world', 'utf8'); // 写入 buffer fs.writeFile('image.png', buffer); const reader = fs.createReadStream(data.path); const stream = fs.createWriteStream(`./image/${Math.floor(Math.random() * 1000)}.jpg`); reader.pipe(stream);
path 模块
const path = require('path'); __dirname: 返回当前文件所在的绝对路径 path.resolve: 将一个路径解析成绝对路径 const path1 = path.resolve('static'); console.log(path1); // 输出绝对路径 // path.join: 用特定平台的分割符号(Linux 为 /,Windows 为 \)对路径进行拼接 const path1 = path.join(__dirname, 'a'); const path2 = path.join(__dirname, 'a/b'); console.log(path1); console.log(path2);
process 模块
const process = require('process'); process.cwd(); // 获取执行脚本时所在的目录 process.argv; // 获取执行脚本时命令行输入的参数 // 标准输出流 process.stdout.write('Hello World'); // 标准输入流 process.stdin.on('data', chunk => { process.stdout.write('Hello' + chunk); process.exit; })
child_process 模块
node 中的 child_process 提供了创建子进程的方式。一共有四种,分别是 spawn, execFile, exec, fork。
其中 fork 是用来创建 node 程序的子进程,前三个用来创建 shell 程序的子进程。
spawn, execFile 和 exec 的区别:
首先,spawn 是基于流的形式,而后两者是基于回调的形式。
spawn 和 execFile 的调用方式相同,与 exec 的调用方式不同。
另外使用 exec 执行一些危险的脚本(如 rm -rf)是会直接执行的;而 execFile 碰到一些危险的操作会爆出异常。因此 execFile 的安全性更高。
event 模块
var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); emitter.on('ev', function(){}); emitter.emit('ev');