express / koa 有什么区别 ?
概念
express 是一个基于 node.js 平台的一个灵活的 web 应用开发框架, connect 中间件;
koa2 相对来说,更新一些,也是由 express 原班人马打造的框架;
集成性
express 内置了视图、static 等部分
koa 要通过中间件来实现
const Koa = require('koa');
const app = new Koa();
// 中间件1
app.use((ctx, next) => {
console.log(1);
next();
console.log(2);
});
// 中间件 2
app.use((ctx, next) => {
console.log(3);
next();
console.log(4);
});
app.listen(8000, '0.0.0.0', () => {
console.log(`Server is starting`);
});
// ⼊⼝⽅法
listen(...args) {
debug('listen');
const server = http.createServer(this.callback());
return server.listen(...args);
}
// (res, req) => { }
callback() {
// 处理中间件,等一下看compose和this.middleware
const fn = compose(this.middleware);
// 错误处理,listenerCount是EventEmitter类的函数
if (!this.listenerCount('error')) this.on('error', this.onerror);
// 传递给createServer的就是下面这个函数
const handleRequest = (req, res) => {
const ctx = this.createContext(req, res);
return this.handleRequest(ctx, fn);
};
return handleRequest;
}
handleRequest(ctx, fnMiddleware) {
const res = ctx.res;
res.statusCode = 404;
const onerror = err => ctx.onerror(err);
// 这里等到response再看
const handleResponse = () => respond(ctx);
// 给请求结束增加一个回调,这个onerror是ctx的onerror,不是app的onerror
onFinished(res, onerror);
// 等一下看这个
return fnMiddleware(ctx).then(handleResponse).catch(onerror);
}
// 添加中间件⽅法
use(fn) {
...
this.middleware.push(fn);
return this;
}
createContext(req, res) {
// 每次请求,ctx都是一个新的对象
const context = Object.create(this.context);
const request = context.request = Object.create(this.request);
const response = context.response = Object.create(this.response);
// 原生的req和res
context.app = request.app = response.app = this;
context.req = request.req = response.req = req;
context.res = request.res = response.res = res;
// koa生成的request和response
request.ctx = response.ctx = context;
request.response = response;
response.request = request;
context.originalUrl = request.originalUrl = req.url;
context.state = {};
return context;
}
'use strict'
/**
* Expose compositor.
*/
module.exports = compose
/**
* Compose `middleware` returning
* a fully valid middleware comprised
* of all those which are passed.
*
* @param {Array} middleware
* @return {Function}
* @api public
*/
function compose (middleware) {
if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')
for (const fn of middleware) {
if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')
}
/**
* @param {Object} context
* @return {Promise}
* @api public
*/
return function (context, next) {
// last called middleware #
let index = -1
return dispatch(0)
function dispatch (i) {
if (i <= index) return Promise.reject(new Error('next() called multiple times'))
index = i
let fn = middleware[i]
if (i === middleware.length) fn = next
if (!fn) return Promise.resolve()
try {
return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
} catch (err) {
return Promise.reject(err)
}
}
}
}
什么是 BFF ?
https://samnewman.io/patterns/architectural/bff/?fileGuid=xxQTRXtVcqtHK6j8
不是一种技术,而是一种在后端普遍采用微服务的情况下,作为适配层,更好的为前端服务。
BFF 一般的作用有哪些 ?
优势:
降低沟通成本
提升用户
问题:
分工
加了一层,比较繁琐
资源浪费
特点:
数据处理
数据聚合和裁剪
格式转换
流量处理
请求分发能力,代理,可靠性
安全问题
鉴权
CSP
Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。
其他常用的ORM
typeorm – TS 支持比较好
prisma – 类型推导更强
knex
bookshelf
npm i sequelize
# 使用 npm
npm i pg pg-hstore # PostgreSQL
npm i mysql2 # MySQL
npm i mariadb # MariaDB
npm i sqlite3 # SQLite
npm i tedious # Microsoft SQL Server
npm i ibm_db # DB2
根据项目下的 .sequelizerc 文件,执行
npx sequelize init:config
生成 config.json 的文件;
npx sequelize init:migrations
生成 migrations 文件夹;
npx sequelize migration:generate --name=init-users
npx sequelize db:migrate
升级数据库,将表推送到数据库中;
npx sequelize db:migrate:undo:all
回退到初始状态;
loader 是在 webpack 的某个阶段上的解析器。
babel-loader
less-loader
css-loader
style-loader
plugin 是在 webpack – tapable
“emit, afterEmit, make, seal, compile”