About Node.js project and express application。
关于Node.js的体验应用,涉及到的功能点有:
- Node.js 内置的核心模块
- express 框架
- mongodb 数据库
- jwt 生成校验token的跨域方案
# 安装应用程序生成器,可以快速搭建一个express应用
npm install -g express-generator
npm install
npm start
ESlint 主要是格式化和校验 js/ts 文件代码,而 Prettier 则可以支持除了 js/ts 之外的文件如: css、html、json、vue等格式化。
# 安装相关依赖
npm install eslint prettier eslint-plugin-prettier eslint-config-prettier eslint-config-airbnb-base --save-dev
# 生成eslint默认配置文件.eslintrc.js
eslint --int
- eslint-config-prettier 主要作用是使用 prettier 默认推荐配置,防止 Prettier 和 ESlint 的格式化冲突
- eslint-plugin-prettier 主要作用是在 eslint 执行的过程中,让代码符合 prettier 的规范,如有不同则进行标记,可以配置抛出错误,可以通过手动的 eslint —fix 来修复
// vscode setting.json
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
},
采用的是 MVC 模式,其实也可以使用功能作为分类,每个功能中包含 MVC,主要是看个人习惯。
- bin:启动脚本语句
- logs:日志信息
- modules:数据模型
- routes:路由,即请求接口路径
- controller: 逻辑处理
- utils:封装的方法
- views:视图,更多用于前后端不分离传统开发模式
- app.js: 入口文件
其实可以理解成一个函数,主要有req,res,next三个参数,next用于流转到下一个参数
- 应用级别的中间件,app.use()、app.get()、app.post()应用到app实例中间件
- 路由级别的中间件,express.Router()
- 错误级别的中间件,放在所有路由之后
- Express 内置的中间件。如express.json和express.urlencoded
- 第三方的中间件。如用于解析表单数据的中间件,body-parser
// 全局中间件
app.use((req,res,next) => {
console.log('这是一个全局中间件,所有的路由都会先经过这个函数处理')
next();
})
// 局部中间件
app.get('/user',auth,(req,res) => {
console.log('auth为局部中间件')
})
// 调用多个局部中间件
app.get('/user',auth,fn,(req,res) => {
console.log('auth为局部中间件')
})
// 或者
app.get('/user',[auth,fn],(req,res) => {
console.log('auth为局部中间件')
})
app.use((error,req,res,next)=> {
console.log('错误中间件,放在所有路由之后')
res.send('发生了一个错误')
})
express-generator
生成的应用带有morgan
日志应用。
const logger = require("morgan");
// 将请求信息打印在控制台,便于开发调试
app.use(logger("dev"));
// 将日志信息输出到指定文件目录
app.use(logger("combined", { stream: accessLogStream }));
自定义日志格式,morgan中有两个概念:
- format:日志格式,本质是代表日志格式的字符串,比如 :method :url :status :res[content-length] - :response-time ms。
- token:format的组成部分,比如上面的:method、:url即使所谓的token
// 自定义format,其中包含自定义的token
morgan.format('Blog', '[Blog] :remote-user [:date[iso]] ":method :url HTTP/:http-version" :status ":user-agent" response-time[digits]');
// 使用自定义的format
app.use(morgan('Blog'));
morgan
日志比较简洁,配置项比较少。具体可以看morgan文档
wiston也是一款非常优秀的日志插件
# 安装依赖项
npm i art-template express-art-template
模版渲染:
app.engine(".html", require('express-art-template'));
app.set("views", path.join(__dirname, "views"));
app.set("view engine", ".html");
// 在路由加载前加上
app.all("*", (req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "*");
res.header("Content-Type", "application/json;charset=utf-8");
res.header("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS");
next();
});