# node知乎服务端

# REST

REST:万维网软件架构风格,用来创建网络服务

  • 客户-服务器(Client-Server):服务端专注数据存储,提升简单性,前端专注界面,提升可移植性
  • 无状态(Stateless):所有用户会话信息保存在客户端,每次请求必须包括所有信息,不能依赖上下文信息
  • 缓存:服务端响应要被标为可缓存和不可缓存
  • 统一接口(Uniform Interface)
  • 分层系统
  • 按需代码

# RESTful API(应用编程接口)

符合rest风格的API

# http 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
		}
	}
})

# 用户认证和授权 JWT

  • session 服务器端,相对安全,兼容性好,cookie在客户端,不太安全;session多服务器部署需要设置共享机制SESSION
  • JWT JSON Web Token

JWT构成:Header+Payload(有效载荷)+Signature(签名)

  • typ:token类型
  • alg:算法,如RSA
{"alg":"HS256","typ":"JWT"}
-----------
//经过base64编码后转成紧凑的字符

# Payload

存储需要传递信息,如用户ID,用户名等,可以加密

# Signature

对Header和Payload签名

jsonwebtoken

koa-jwt

# 知乎上传图片

koa-body

koa-static

最后更新: 12/25/2020, 1:47:34 PM