# node知乎服务端
# REST
REST:万维网软件架构风格,用来创建网络服务
- 客户-服务器(Client-Server):服务端专注数据存储,提升
简单性,前端专注界面,提升可移植性 - 无状态(Stateless):所有用户会话信息保存在客户端,每次请求必须包括所有信息,不能依赖上下文信息
- 缓存:服务端响应要被标为可缓存和不可缓存
- 统一接口(Uniform Interface)
- 分层系统
- 按需代码
# RESTful API(应用编程接口)
符合rest风格的API
# http options方法作用
- 检测服务器所支持的请求方法
- CORS中预检请求 options与跨域
# allowedMethods作用
- 响应options方法,告诉他所支持的请求方法
- 相应的返回405(不允许【是个常用的方法,但是路由没实现时返回如delete】)和501(没实现【是个生僻的方法,koa都没去实现它如link】)
# 控制器
拿到路由分配的任务,并执行。
- 获取HTTP请求参数
- 处理业务逻辑
- 发送不同的响应
# 获取http请求参数
- url传递
- querystring 如?q=keyword(是可选的)
- router params 如/users/:id(必须的)
- body传递
- json 如{name:'lee'}
- form表单
- header 如 Accept、Cookie
# 具体
- header => ctx.header
- url query => ctx.query
- router params => ctx.params
- body koa2无法获取,需要中间件(koa-bodyparser) => ctx.request.body
let bodyparser=require("koa-bodyparser")
app.use(bodyparser())
# 发送HTTP响应
- 发送Status 如200/400
- 发送body,如{name:'lee'}
- 发送header,如allow,Content-Type
# 具体
- Status => ctx.status=200
- body => ctx.body={a:"b"}
- header => ctx.set("Allow","GET, POST")
- ctx.throw(412)
# 自动化注册路由
const Koa = require('koa');
const app = new Koa();
const routing = require('./routes');
app.use(xxxx);
routing(app);
app.listen(3000, () => console.log('程序启动在 3000 端口了'));
const fs = require('fs');
module.exports = (app) => {
fs.readdirSync(__dirname).forEach(file => {
if (file === 'index.js') { return; }
const route = require(`./${file}`);
app.use(route.routes()).use(route.allowedMethods());
});
}
# koa2异常处理
- 运行时错误 500
- 逻辑错误 404 412 422
- ctx.throw(412)/ ctx.throw(412,'xxxx,xxxx')
app.use(async (ctx,next) => {
ctx.throw(500);
});
------------------------
app.use(async (ctx,next) => {
ctx.response.status = 404;
ctx.response.body = 'Page Not Found';
});
手动设置错误中间件,写在最上方,404错误无法捕捉
app.use(async (ctx,next)=>{
try{
await next()
}catch(err){
ctx.status = err.status|| err.statusCode||500
ctx.body={
message:err.message
}
}
})
- koa2的中间件 koa-json-error koa-parameter
- mongoose
# 用户认证和授权 JWT
- session 服务器端,相对安全,兼容性好,cookie在客户端,不太安全;session多服务器部署需要设置共享机制SESSION
- JWT JSON Web Token
JWT构成:Header+Payload(有效载荷)+Signature(签名)
# Header
- typ:token类型
- alg:算法,如RSA
{"alg":"HS256","typ":"JWT"}
-----------
//经过base64编码后转成紧凑的字符
# Payload
存储需要传递信息,如用户ID,用户名等,可以加密
# Signature
对Header和Payload签名