思路:将所有路由都封装在 routes 内,在app.js中把每次可能的路径信息都只是调用routes,routes中统一格式做适配。
在app.js中:
1.创建静态web服务(这个是用作访问静态站点或者文件比如路径后加入index.html等等)
2.实现路由(这个是类似于www.xxx.con/login 这种形式,没有访问文件但是需要实现某种操作)
以上两种情况都被看做 routes中的方法,其中1的名字肯定叫static,2每一个可能的路由都弄一个名字,名字的参数是一样的,所以可以直接用变量替代访问。
// app.js
const http = require('http');
const routes = require('./module/routes');
const url = require('url');
http.createServer(function (req, res) {
console.log(req.method);
// 创建静态web服务
routes.static(req, res, 'my_website');
// 路由
let pathname = url.parse(req.url).pathname.replace("/", "");
try {
routes[pathname](req, res);
} catch (error) {
routes['error'](req, res);
}
}).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');
//routes.js
const fs = require('fs');
const path = require('path');
const url = require('url');
const ejs = require('ejs');
let getFileMime = function (extname) {
let data = fs.readFileSync('./data/mime.json');
let mimeObj = JSON.parse(data.toString());
return mimeObj[extname];
}
let app = {
login: (req, res) => {
ejs.renderFile('./views/form.ejs', (err, data) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset="utf-8"' });
res.end(data);
})
},
register: (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html' + ';charset="utf-8"' });
res.end('注册页面');
},
dologin: (req, res) => {
var postData = '';
req.on('data', (chunk) => postData += chunk); // chunk是片段
req.on('end', () => {
console.log(postData);
res.end(postData);
});
},
static: (req, res, staticPath) => {
// 1. 获取地址
let pathname = url.parse(req.url).pathname;
pathname = pathname=='/'?'/index.html':pathname;
let extname = path.extname(pathname);
// 2. 通过fs模块读取文件
if (pathname != '/favicon.ico') {
// 同步方法
try {
let data = fs.readFileSync('./' + staticPath + pathname);
if (data) {
let mime = getFileMime(extname);
// console.log(' -' + extname + ' ' + mime);
res.writeHead(200, { 'Content-Type': '' + mime + ';charset="utf-8"' });
res.end(data);
}
} catch (err) {
}
}
},
news: (req, res) => {
let msg = '这是一个数据';
let list = [
{
title: "新闻1",
},
{
title: "新闻2",
},
{
title: "新闻3",
}
];
ejs.renderFile('./views/news.ejs', {
msg: msg,
newslist: list
}, (err, data) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset="utf-8"' });
res.end(data);
})
},
error: (req, res) => {
res.end('error');
}
}
module.exports = app;