总体架构

开发环境搭建

使用webstorm进行开发,新建项目,发现没有nodejs智能提示
安装node智能提示

通过npm init新建项目
两个好用的插件:
全局安装nodemon,支持热重载
项目安装cross-env,兼容操作系统

配置package.json的script选项
配置中的NODE_ENV=dev,当以npm run dev启动时,process.env.NODE_ENV的值就为dev

1
2
"dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js",
"prd": "cross-env NODE_ENV=production nodemon ./bin/www.js"

设计接口

响应结构设计

1
2
3
4
5
6
7
8
9
10
11
12
//成功
{
errno: 0,
data: {},
message: ''
}

//失败
{
errno: -1,
message: ''
}

通过es6的class新建响应模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class BaseModel {
constructor(data, message) {
if(typeof data === 'string'){
this.message = data
data = null
message = null
}
if(data) {
this.data = data
}
if(message){
this.message = message
}
}
}

class SuccessModel extends BaseModel {
constructor(data, message){
super(data, message)
this.errno = 0
}
}

class ErrorModel extends BaseModel {
constructor(data, message){
super(data, message)
this.errno = -1
}
}

module.exports = {
SuccessModel,
ErrorModel
}

项目结构拆分

将启动服务器封装成www.js,外部传入服务器响应函数
响应函数在app.js中进行定义,函数中都可以引用req,res对象
对路由进行拆分,博客路由和用户路由,在app.js中进行引用
app.js中引用路由对所有请求拦截处理,有对应路由返回数据否则返回404
新建controller文件夹,主要用于操作数据,然后在router中引用对应controller中的方法
router中调用controller方法获得数据,封装成响应model并返回数据
新增配置文件,配置mysql和redis链接信息
封装mysql链接工具,封装执行sql函数

对promise的一些疑惑

碰到的一些小bug

sql语句定义的不规范,${username}应该要加上引号

1
const sql = `select username, realname from user where username=${username} and password=${password}`

日志系统

1.访问日志
2.自定义日志,包括自定义事件,错误记录等

通过流对象写日志
日志的拆分,按照天等(通常用linux的定时任务crontab)

sql注入的d防范

使用mysql的escape函数,所有的字段先用escape转义
然后dadaw${xxx}中的${xx}就不用加引号了

npm xss模块