express 中间件
1 普通路由
-
先写个普通路由,能够根据不同的路径访问不同的文件
const http = require('http') const fs = require('fs') const path = require('path') const server = http.createServer (function (req, res) { res.writeHead(200) res.end(fs.readFileSync(path.join(__dirname, 'public', req.url))) }) server.listen(8001)
这样写实现了我们的功能,但是有个缺陷, 如果找不到文件,怎么办? 此时应该执行其他的逻辑,比如匹配
api
路由,假设我们要分别匹配文件路由和api
路由此时我们的逻辑是
fs
读目录,判断是否有匹配上文件,如果没有的话放行- 执行
api
判断,没有的话放行 - 如果文件路由和
api
路由都没匹配上,返回404
1.1 文件路由
-
先做第一步,判断是否文件能够匹配,我搜了下读文件的
api
发现了readdir
,就按照最简单的逻辑写了一个判断有没有文件的const http = require('http') const fs = require('fs') const path = require('path') const mime = require('mime-types') const server = http.createServer (function (req, res) { fs.readdir('public', function(error, files) { files.forEach((file) => { if(req.url.slice(1, req.url.length) === file) { res.writeHead(200, mime.lookup(req.url.split('.')[1])) res.end(fs.readFileSync(path.join(__dirname, 'public', req.url))) } }) }) }) server.listen(8001)
**缺陷:**目录是个树形的结构,这样显然不能遍历到全部的文件
-
解决以上问题,并且简单加入重定向
const http = require('http') const fs = require('fs') const path = require('path') const mime = require('mime-types') //需要下载mime-type的npm包 function getFile(dir, pathname) { try{ return fs.readFileSync(path.join(__dirname, dir, pathname)) } catch(e) { return null } } const server = http.createServer (function (req, res) { if(req.url === '/') { res.setHeader('Location', 'index.html') res.writeHead(301) res.end() return } const file = getFile('public', req.url) if(file) { res.setHeader('Content-Type', mime.lookup(req.url)) res.writeHead(200) res.end(file) } else { res.writeHead(404) res.end() } }) server.listen(8003)
1.2 api路由
目标是写一个用户登录的接口
-
先写个简单的ui
<form action="/login" method="POST"> <input name="name" placeholder="请输入用户名"> <input name="password" type="password" placeholder="请输入密码"> <input type="submit" value="登陆"> </form>
-
现在要获取请求的参数了,这里是
post
请求,数据在请求体里,并且如果文件过大,那么数据会分组传输,如果数据过大,可能请求行和请求头服务端先受到了,就会执行回调函数,但是数据还没有接收完,这种情况能发挥node
异步的优势。let data = '' //监听接收数据的事件,收到数据后把数据拼接起来 req.on('data', function(chunk) { data += chunk }) //end事件说明事件好了,打印下 req.on('end', function() { console.log(data) })
成功拿到请求体
但是如果这样写能拿到
data
嘛答案是不能, 因为异步,但是由于我还不会
promise、async、await
之类的方法,所以只能用笨方法写了,那就是回调地狱!!<