本文共 3656 字,大约阅读时间需要 12 分钟。
服务器上有许多资源,每个资源都有自己的 URL。客户端浏览器想要访问某个资源,就需要向服务器发起对应的请求。静态资源和接口是服务器处理请求的两种主要方式。
静态资源
index.html, style.css, index.js 等。动态资源(接口)
<a> 标签进行跳转。form 的 method 为 POST。目标:提供一个名为 getList 的接口 (http://localhost:8083/getList),以 JSON 字符串格式返回 db/data.json 的内容。
http://localhost:8083/getList。db/data.json 的内容。const http = require('http');const fs = require('fs');const path = require('path');const server = http.createServer((req, res) => { if (req.url === '/getList' && req.method === 'GET') { const filePath = path.join(__dirname, 'db', 'data.json'); const data = fs.readFileSync(filePath, 'utf8'); res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ list: JSON.parse(data) })); } else { res.statusCode = 404; res.end('错误的路径'); }});server.listen(8083, () => { console.log('服务器运行在 8083 端口上');}); req.url 和 req.method 判断请求路径和类型。res.end() 的参数只能是字符串或 Buffer 对象。JSON.stringify 用于将数据转换为 JSON 字符串格式返回。目标:提供一个名为 getList 的接口 (http://localhost:8083/getList?name=xxxx),以 JSON 字符串格式返回 db/data.json 中名称为 xxxx 的数据。
const http = require('http');const fs = require('fs');const path = require('path');const querystring = require('querystring');const server = http.createServer((req, res) => { if (req.url === '/getList' && req.method === 'GET') { const [url, queryStr] = req.url.split('?'); const queryObj = querystring.parse(queryStr); const filePath = path.join(__dirname, 'db', 'data.json'); const data = fs.readFileSync(filePath, 'utf8'); const list = JSON.parse(data); const result = list.find(item => item.id === queryObj.id); if (result) { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(result)); } else { res.statusCode = 404; res.end('未找到对应数据'); } } else { res.statusCode = 404; res.end('错误的路径'); }});server.listen(3000, () => { console.log('服务器运行在 3000 端口上');}); querystring 模块解析查询字符串。find 方法查找数据库中符合条件的数据。目标:提供一个名为 add 的接口 (http://localhost:8083/add),以 POST 请求方式传入 name 值,将数据保存到 db/data.json 中。
const http = require('http');const querystring = require('querystring');const server = http.createServer((req, res) => { if (req.url === '/add' && req.method === 'POST') { let result = ''; req.on('data', (chunk) => { result += chunk; }); req.on('end', () => { const parsedData = querystring.parse(result); const filePath = path.join(__dirname, 'db', 'data.json'); const data = fs.readFileSync(filePath, 'utf8'); const list = JSON.parse(data); list.push(parsedData); fs.writeFileSync(filePath, JSON.stringify(list, null, 2)); res.setHeader('Content-Type', 'application/json'); res.end({ message: '数据已添加', data: parsedData }); }); } else { res.statusCode = 404; res.end('错误的路径'); }});server.listen(8000, () => { console.log('服务器运行在 8000 端口上');}); req.on('data') 和 req.on('end') 接收 POST 请求参数。querystring 模块用于解析 POST 请求体中的查询字符串。fs.writeFileSync,以保持数据的一致性。转载地址:http://fdca.baihongyu.com/