# express-learn **Repository Path**: jxmlearner/express-learn ## Basic Information - **Project Name**: express-learn - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-08 - **Last Updated**: 2021-06-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README linux命令: + cp -r 01 02 复制01目录成02 (-r是递归复制) 查看本机全局安装的npm包 + npm list -g --depth 0 # 1. 初始化express项目 ``` npm init -y npm i express -S # 为了方便调试全局安装nodemon npm i -g nodemon ``` ## 1.1 Hello World ```js const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(3000, () => { console.log('Server running at http://localhost:3000/') }) ``` ## 1.2 工具方法promisify使用 ```js const fs = require('fs') const path = require('path') const { promisify } = require('util') const readFile = promisify(fs.readFile) const dbPath = path.join(__dirname, './db.json') exports.getDb = async () => { const data = await readFile(dbPath, 'utf-8') return JSON.parse(data) } ``` 使用 ```js const express = require('express') const fs = require('fs') const { getDb } = require('./db') const app = express() app.get('/todos', async (req, res) => { try { const db = await getDb() res.status(200).json(db.todos) } catch (err) { res.status(500).json({ error: err.message }) } }) ``` ## 1.3 配置解析请求表单的请求体 ```js const app = express() // 配置解析表单请求体 application/json app.use(express.json()) // 配置解析 application/x-www-form-urlencoded表单请求体数据 app.use(express.urlencoded()) ``` ## 1.4 Express中的中间件 1. 应用程序级别的中间件 2. 路由级别的中间件 3. 错误处理中间件 4. 内置中间件 5. 第三方中间件 ## 1.5 Express的错误处理中间件 ```js const express = require('express') const { getDb, saveDb } = require('./db') const app = express() // 配置解析表单请求体 application/json app.use(express.json()) // 配置解析 application/x-www-form-urlencoded表单请求体数据 app.use(express.urlencoded({ extended: false })) app.get('/todos', async (req, res, next) => { try { const db = await getDb() res.status(200).json(db.todos) } catch (err) { // 捕获到错误后,将错误传递给错误处理中间件处理 next(err) // 这个next会跳过所有剩余的非错误处理路由和中间件函数,直接到错误处理中间件 } }) // 通常会在所有路由之后配置处理404 app.use((req, res, next) => { res.status(404).send('404 Not Found.') }) // 错误处理中间件 // 在所有的中间件之后挂载错误处理中间件 // 错误处理中间件始终带有4个参数,必须提供4个参数以将其标识为错误处理中间件 // 即使不需要使用next对象,也必须指定它以维护签名。否则,该next对象将被解释为常规中间件,并且将无法处理错误 // 如果将任务内容传递给next() 函数(字符串'route'除外),Express都会将当前请求视为错误,并且将跳过所有剩余的非错误处理路由和中间件函数。 app.use((err, req, res, next) => { console.error(err) res.status(500).json(err.message) }) app.listen(3000, () => { console.log('Server is running at http://localhost:3000/') }) ``` # 2.项目 ## 2.1 windows下的环境变量处理 `npm i cross-env -S` ## 2.2 密码加密和比较 `npm i bcrypt -S` ```js const bcrypt = require('bcrypt') const newPwd = bcrypt.hashSync('123456', 10) console.log('加密后的密码', newPwd) // 验证比对,返回布尔值表示验证结果 true表示一致,false表示不一致 const isOk = bcrypt.compareSync('123456', newPwd) console.log('比较密码的结果', isOk) ```