# express-serve-pro
**Repository Path**: topazur/express-serve-pro
## Basic Information
- **Project Name**: express-serve-pro
- **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-02-21
- **Last Updated**: 2021-03-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# [安装](https://www.expressjs.com.cn/starter/generator.html)
```bash
$ npx express-generator --view ejs --css less --git # 在 Node.js 8.2.0 及更高版本中使用npx
run the app: ???
> SET DEBUG=express-server:* & npm start
```
## 参考资料
- [Nodejs全栈入门-慕课网视频教程](https://www.imooc.com/learn/1199)
- [Sequelize ORM](https://sequelize.org/)
- [PM2 Qucik Start](https://pm2.keymetrics.io/docs/usage/quick-start/)
- [postman](https://www.postman.com/)
- [REST Client 测试(vscode插件)](https://www.jianshu.com/p/be63bb085844)
- [VSCode插件推荐 | REST Client: 也许是比Postman更好的选择 ](https://www.sohu.com/a/295730790_791833)
- [postman汉化](https://gitee.com/hlmd/PostmanCn#https://gitee.com/hlmd/PostmanCn/releases)
- [Vue.js 3.0使用cleave.js](https://www.linchaoqun.com/html/cms/content.jsp?menu=vuejs3.0&id=746181b5-b73a-4ec0-a09e-ae9952106247)
- [jsPDF](https://www.cnblogs.com/xuezizhenchengxuyuan/p/6023409.html)
- [mysql8 安装](https://blog.csdn.net/qq_37350706/article/details/81707862)
- [Retrofit响应数据规则](https://lionoggo.blog.csdn.net/article/details/52689010)
- [git commit 规则](https://zhuanlan.zhihu.com/p/90281637)
# MySQL & MongoDB 安装与卸载
/**
* mongod --dbpath=/usr/local/mongodb/data/db --logpath=/usr/local/mongodb/logs/mongo.log --port=27017 --bind_ip=0.0.0.0 --logappend --fork --auth
* 把 “bind_ip: 127.0.0.1”默认只允许本地连接(或者构建SSH通道,然后通过localhost连接);改为“bind_ip: 0.0.0.0”允许所有, 使其能通过外链连接。
*
* 开机自动启动mongodb,编辑/etc/rc.d/rc.local,在文件后面加上如下这行
* /usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb.conf
*
* http://www.360doc6.net/wxarticlenew/680678706.html
*
* https://www.cnblogs.com/blogchen/articles/9074594.html
* find / -name mysql rpm -qa | grep mysql
* `arch`命令:aarch64 就是 ARM 架构,x86_64 就是 X86 架构;MIPS 架构不知道输出什么,没见过,估计也是直接输出 mips,我们可以用排除法,如果不是前两种就是 MIPS 架构。
* 安装:https://blog.csdn.net/forebe/article/details/110041126
* mysql8修改密码[1396 (HY000)]:https://blog.csdn.net/q258523454/article/details/84555847
* [1290 (HY000)]:https://www.cnblogs.com/iosdev/archive/2013/07/15/3190431.html
* 修改三种方式:https://www.cnblogs.com/chuckjam/archive/2018/08/10/9456255.html
* 密码策略:https://www.cnblogs.com/Owen-ET/p/9644727.html
* (更改密码后):https://www.jb51.net/article/159115.htm
*
*/
# [性能-performance](https://www.expressjs.com.cn/zh-cn/advanced/best-practice-performance.html)
1. 使用 gzip 压缩
对于生产环境中的大流量网站,实施压缩的最佳位置是在反向代理层级(请参阅使用反向代理)。在此情况下,不需要使用压缩中间件[compression](https://www.npmjs.com/package/compression)。有关在 Nginx 中启用 gzip 压缩的详细信息,请参阅 Nginx 文档中的 [ngx_http_gzip_module 模块](http://nginx.org/en/docs/http/ngx_http_gzip_module.html)。
2. 不使用同步函数
- 同步函数和方法会阻止执行进程的运行,直至其返回。对同步函数的每次调用可能在数微秒或数毫秒后返回,但是在大流量网站中,这些调用的累积返回时间也相当可观,会影响到应用程序的性能。因此应避免在生产环境中使用同步函数。
- 虽然 Node 和许多模块提供函数的同步和异步版本,但是在生产环境中请始终使用异步版本。只有在初始启动时才适合使用同步函数。
- 使用 `--trace-sync-io` 命令行标记,每当应用程序使用同步 API 时就显示一条警告消息和堆栈跟踪。
3. 正确进行日志记录
- 出于调试目的 - [debug](https://www.npmjs.com/package/debug) 这样的特殊调试模块
- 出于应用程序活动目的(除调试以外的其他所有事项)
如果要对应用程序活动进行日志记录(例如,跟踪流量或 API 调用),请使用 [Winston](https://www.npmjs.com/package/winston) 或 [Bunyan](https://www.npmjs.com/package/bunyan) 之类的日志记录库,而不要使用 console.log()。要了解这两个库的详细对比,请参阅 StrongLoop 博客帖子 [Comparing Winston and Bunyan Node.js Logging](https://strongloop.com/strongblog/compare-node-js-logging-winston-bunyan/)。
4. 正确处理异常
- 回调函数必须相应地遵循“error-first”回调约定
- Promise 可以处理使用 then() 的异步代码块中的任何异常(显式和隐式)。只需将 .catch(next) 添加到 Promise 链的末尾。
```js
app.get('/', function (req, res, next) {
// do some sync stuff
queryDb()
.then(function (data) {
// handle data
return makeCsv(data)
})
.then(function (csv) {
// handle csv
})
.catch(next);// 所有异步和同步错误都会传播到错误中间件。!!!
});
```
5. 环境/设置中的注意事项
- 将 NODE_ENV 设置为“production”
[nodejs 设置 NODE_ENV 环境变量](https://www.cnblogs.com/fhen/p/6293763.html)
# 文件上传
* [`await util.promisify(fs.stat)('text1.txt')` & `fs.constants.F_OK`](https://blog.csdn.net/xgangzai/article/details/112914531)
* [`fs.accessSync(path[, mode])`](http://nodejs.cn/api/fs/fs_accesssync_path_mode.html)
* [文件可访问性的常量: `fs_file_access_constants`](http://nodejs.cn/api/fs.html#fs_file_access_constants)
* [nodejs之multiparty插件使用简析](https://blog.csdn.net/weixin_30338481/article/details/95833931)
* [大文件上传前台分片后 后台合并的问题](https://www.cnblogs.com/goloving/p/12825973.html)
# [MySQL的排序规则](https://www.cnblogs.com/unclewang666/p/10540634.html)
一、对比 1、utf8_general_ci 不区分大小写, utf8_general_cs 区分大小写 2、utf8_bin: compare strings by the binary value of each character in the string 将字符串每个字符串用二进制数据编译存储,区分大小写,而且可以存二进制的内容。 3、utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法,一些字符还是不能支持;utf8_unicode_ci不能完全支持组合的记号。 说明:ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的。bin 是二进制, a 和 A 会别区别对待。例如你运行:SELECT * FROM table WHERE txt = 'a',那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以。utf8_general_ci是一个遗留的 校对规则,不支持扩展,它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用 utf8_unicode_ci的校对规则相比,比较正确性较差。 二、应用上的差别 1、对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。 2、utf8_general_ci也适用与德语和法语,除了‘?’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用 utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。 三、使用 utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下,新建数据库时一般选用utf8_general_ci就可以了。
# sequelize ( &cli ) -- ORM
> web->webserver->router->handler->orm->db
## 初始化mysql数据库
安装并配置好mysql数据库`todo_development`,并且安装好`sequelize`依赖后,
在项目`todo_api/db`目录下执行如下操作
```
npx sequelize db:migrate
```
完成`todo_development`数据库的初始化,这条命令会将`todo_api/db/migrations`目录下的`20200823035851-create-todo.js`中的模型Todos导入到`todo_development`数据库中,
其中定义了Todos模型,使用这条命令后会在数据库中新增一张Todos表。
## 数据库的初始化
1. 创建一个数据库
2. 使用 `sequelize cli` 初始化项目的数据库配置信息
` npx sequelize init `
3. 生成模型文件
- A. migrate 文件
- B. model 文件
` npx sequelize model:generate --name Todo --attributes name:string,deadline:date,content:string `
4. 持久化, 模型对应的[数据库表]
` npx sequelize db:migrate `
## 接口调试
### 1. [postman](https://www.postman.com/)
### 2. VSCode plugin: `Rest Client`
在VSCode中安装好RestClient插件后,在根目录下编写一个` api.http `的文件,并写入如下代码:
```
http语言规则:见`test`目录下
```
## 测试断言库
[should、chai](for test)
# 项目的发布和运维
> pm2
**启动命令/运维命令/运维命令/运维文档:**
1. pm2 start ecosystem.config.js
2. pm2 logs
3. pm2 restart ecosystem.config.js
# bug
1. Port xxxx is already in use
```bash
# 查找正在運行的端口的PID
$ netstat -a -n -o
# 根据pid删除进程
$ taskkill -f /pid 17200
或者
$ npm install killport2 -g
$ killport 3000
```
2. 安装bcrypt报错
- https://www.cnblogs.com/wangyuxue/p/11218113.html
- https://blog.csdn.net/qfxlw/article/details/85331869
- https://www.jb51.cc/centos/373456.html
```bash
# 通过管理员模式执行以下代码: 安装Python环境
$ npm install --global --production windows-build-tools
$ npm install -g node-gyp # 调用一些其他语言编写的工具
# 上面步骤如果没有安装好python2.7,则安装下
$ npm install --python=python2.7
$ npm config set python python2.7
npm config get python
```