仿express框架封装路由
创建router.js
文件
import url from 'url'
// 事件中心
const eventEmitter = {}
export const app = (req, res) => {
let pathname = url.parse(req.url).pathname
// 由于pathname前面总是带/,这里处理路径统一形式/pathname/
if (!pathname.endsWith('/')) {
pathname = pathname + '/'
}
// 事件中心调用
if (eventEmitter[pathname]) {
eventEmitter[pathname](req, res)
} else {
res.end('no routers')
}
}
// 注册路由,类似发布订阅
app.get = (pathName, callback) => {
// 处理路径变成/pathName/
if (!pathName.endsWith('/')) {
pathName = pathName + '/'
}
if (!pathName.startsWith('/')){
pathName = '/' + pathName
}
// 注入事件中心
eventEmitter[pathName] = callback
}
server.js 使用封装的路由
import http from 'http'
import { app } from './router.js'
http.createServer(app).listen(3000)
console.log('Server is run at port 3000')
app.get('login', (req, res) => {
res.end('login')
})
app.get('register', (req, res) => {
res.end('register')
})
加入get
和post
处理
router.js
import url from 'url'
// 添加send方法
const setHeader = res => {
res.send = data => {
res.writeHead(200, {'Content-Type': 'text/html;charset=utf8'})
res.end(data)
}
}
// 事件中心
const eventEmitter = {
get: {},
post: {}
}
export const app = (req, res) => {
setHeader(res)
let {pathname, query} = url.parse(req.url)
// 获取method,方便判断post或get
const method = req.method.toLowerCase()
if (!pathname.endsWith('/')) {
pathname = pathname + '/'
}
if (method === 'get' && eventEmitter.get[pathname]) {
req.query = query
eventEmitter.get[pathname](req, res)
} else if (method === 'post' && eventEmitter.post[pathname]) {
let postStr = ''
req.on('data', chunk => {
postStr+=chunk
})
req.on('end', (err, chunk) => {
req.body = postStr
eventEmitter.post[pathname](req, res)
})
} else {
res.end('no routes')
}
}
app.get = (pathName, callback) => {
if (!pathName.endsWith('/')) {
pathName = pathName + '/'
}
if (!pathName.startsWith('/')){
pathName = '/' + pathName
}
eventEmitter.get[pathName] = callback
}
app.post = (pathName, callback) => {
if (!pathName.endsWith('/')) {
pathName = pathName + '/'
}
if (!pathName.startsWith('/')){
pathName = '/' + pathName
}
eventEmitter.post[pathName] = callback
}
server.js
import http from 'http'
import ejs from 'ejs'
import { app } from './router.js'
http.createServer(app).listen(3000)
console.log('Server is run at port 3000')
// 根据路由渲染login.ejs模板
app.get('login', (req, res) => {
ejs.renderFile('./views/login.ejs', {}, (err, data) => {
res.send(data)
})
})
// login.ejs 模板中form表单的请求方式为post
app.post('handleLogin', (req, res) => {
res.send(req.body)
})
// login.ejs 模板中form表单的请求方式为get
app.get('handleLogin', (req, res) => {
res.send(req.query)
})