在 Node.js 中我们想要连接我们建立的数据库的话可以查阅 文档 这个网站GitHub - mysqljs/mysql: A pure node.js JavaScript Client implementing the MySQL protocol.实现 MySQL 协议的纯node.js JavaScript 客户端。左边这个是旧的文档。1、连接数据库1.1、安装mysql2首先我们可以使用这个指令进行安装npm install --save mysql2 在这里我们选择安装 MySQL2 是因为它有更快、更好的性能。1.2、连接数据库// Get the client import mysql from mysql2/promise; // Create the connection to database const connection await mysql.createConnection({ host: localhost, user: root, database: test, });这里的代码是 MySQL2 的文档里面的例子。我们可以使用mysql.createConnection() 这个函数去连接数据库其中 host 后面写数据库的 Ip地址 user 后面写登录数据库的账号password 后面写登录数据库的密码database 后面写你要连接的数据库。但在这里我们使用 mysql.createPool() 。const mysql require(mysql2) const Mock require(mockjs) const db mysql.createPool({ host:127.0.0.1,//数据库的IP地址 user:user,//登录数据库的账号 password:password,//登录数据库的密码 database:lists//要操作的数据库 })二者区别如果说 createConnection() 是单个连接把它比作公路那么createConnection()这个函数就时只有一条车道的公路每一个后端的请求就是一辆车通过这条公路就需要排队请求需要排队车多了就容易堵车不能及时请求单个连接在每一次用完就要关闭就像你租借东西一样用完就要归还所以在多个请求下我们需要建立长连接来满足需求无法处理并非请求因此 createConnection() 适合简单的脚本。而 createPool() 是连接池它则是一条拥有多条车道的公路多条车辆可以通过多个请求可以同时并非进行处理车道数量固定但一直在那里也就是连接一直保持在整个应用关闭时才需要关闭就像一个公司倒闭时才解散适合做Web服务器。图1 是我的后端连接数据库的代码图2 则是我的后端代码连接的数据库的结构其中 lists 是我的数据库名称而 Tables 下面则是我的 lists 数据库管理的表可以看到里面只有一个 users这一个表萌新刚接触的话先从一个表慢慢来慢慢过渡。1.3、执行函数我们可以在官方文档中查到我们想要在 Node.js 中执行代码就需要使用 .query() 注意 query前面是有一个小数点的。下图是官方文档的原话。只不过我们这里只使用第二种方法。const sqlStr select * from users db.query(sqlStr,(err,results){ if(err) return console.log(err.message) console.log(results) })这是一个简单的例子其中我们讲 SQL 指令赋值给了 sqlStr 这个变量这样方便我们之后的更改如果执行错误就会调用 if(err) 如果执行成功就会执行下面的语句。1.4、占位符占位符是在SQL语句中使用特殊标记来代替实际值的位置真实的值在执行时单独传入。这类似于函数参数 - 你先定义函数结构调用时才传入具体参数值使用占位符而不是字符串拼接是防止SQL注入攻击的最有效措施。这里常用的是 ? 这个占位符。const sqlStr insert into person (id,username,password) values (?,?,?) db.query(sqlStr,[1,admin,123456],(err,results){ if(err) return if(results){ console.log(插入成功,results) } })2、安装mock.js:首先我们通过这个指令来安装 mock.jsnpm install mockjs;这是官网Mock.js 我们为什么需要安装这个 mock.js 呢因为 mock.js 可以模拟大部分我们所需要的数据类型在后端还没有写出前端开发需要的接口时前端可以使用 mock.js 去模拟自己需要的数据类型需要提前和后端沟通避免使用模拟数据去渲染页面但达不到预期的效果使用模拟的数据去进行页面渲染因此 mock.js 适合在开发阶段进行使用。同时在这次的项目里面其实算是通过这个简单的东西入门而已没有真实的数据但项目不能因此停滞不前所以在后端代码中安装 mock.js 去模拟数据并将其插入到数据库中达到我们需要的预期效果。3、安装 express:1、安装express:使用这个指令 npm install express 。这是中文官网:Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网我们在这里使用 express 来搭建一个简单的服务器在这个服务器里面我们可以使用get、post、put、delete 来对前端的请求进行回应下面以 GET 请求为例其他请求方式如 POST、PUT等模式类似。上图是官网的一个例子其中 app.get() 后面的 .get 就是对应着前端的对应请求函数里面的第一个参数是请求路径第二个参数是回调函数 里面的 req 是请求对象 res 是响应对象。 req包含了请求的全部信息res用于向客户端前端返回数据。2、中间件中间件指业务流程的中间处理环节。 中间件是 express 框架中的一个核心机制你可以把他想象成一个流水线或安检流程当一个请求达到服务器后在到达最终的路由处理函数之前它需要经过这一系列中间件函数的处理而中间件就是这个流水线。每一个中间件都是一个函数接收三个参数1req: 请求对象2res: 响应对象3next: 下一个中间件函数中间件可以执行一下任务1执行任何代码例如记录日志、解析数据2修改请求和响应对象3结束请求-响应周期例如验证失败直接返回错误4调用栈中的下一个中间件通过调用 next() 注如果某个中间件没有结束请求如 res.send() 也没有调用 next() 请求将会被挂起永远不会到达路由。3.1、全局中间件客户端发起的任何请求到达服务器之后都会触发的中间件叫做全局生效的中间件通过调用 app.use(中间件函数)即可定义一个全局生效的中间件。例如const mw function(req,res,next){ console.log(这是一个最简单的中间件函数) next() } app.use(mw)中间件的作用多个中间件之间共享同一份 req 和 res 。 基于这样的特性我们可以在上游的中间件中统一为 req 或 res 对象添加自定义的属性或方法供下游的中间件或路由进行使用。定义多个全局中间件可以使用 app.use()连续定义多个全局中间件客户端请求到达服务器之后会按照中间件定义的先后顺序依次进行调用。3.2、局部生效的中间件不使用 app.use() 定义的中间件叫做局部生效的中间件。定义多个局部中间件可以在路由中通过如下两种等价的方式使用多个局部中间件4、安装 cors:1、安装cors:我们在上面的 express 编写的 GET 接口其实是存在一个严重的问题那就是他不支持跨域请求。举一个例子我们电脑里面有很多的端口。图1 这个 3002 就是我的后端端口而 127.0.0.1则是电脑本地地址而图2 这个 5173 就是前端的端口而 2 个不同的端口就是 2 个不同的地址我们无法获取不同地址的数据所以我们如果只使用 express 的话是获得不了前端的请求因此我们需要使用 cors 来解决这个问题。而 cors 则是 express 的一个第三方中间件通过安装和配置 cors 中间件可以很方便的解决跨域问题使用步骤分为如下3步1运行 npm install cors 安装中间件。2使用 const cors require(cors) 导入中间件。3在路由之前调用 app.use(cors()) 配置中间件。上面的图片就是上面的具体解释跨域资源共享 (CORS) 配置 - 网络安全 | MDN - MDN 文档上面的是 MDN 文档对 cors 的描述。2、cors 响应头部2.1 -- Access-Control-Allow-Origin:响应头部中可以携带一个 Access-Control-Allow-Origin字段语法如下Access-Control-Allow-Origin: origin | *res.setHeader(Access-Control-Allow-Origin,http://itcast.cn)http://itcast.cn这个是例子如果指定了 Access-Control-Allow-Origin 字段的值为通配符 * 表示允许来自任何域的请求。其中origin 参数的值指定了允许访问该资源的外域 URL这也是我们跨域请求的关键。2.2、-- Access-Control-Allow-Methods:默认情况下 cors 仅支持客户端发起 GET、POST、HEAD请求。如果客户端希望通过 PUT、DELETE等方式请求服务器的资源则需要在服务器通过 Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法。例如res.setHeader(Access-Control-Allow-Methods,POST,GET,DELETE,HEAD)这个代码只允许 POST、GET、 DELETE、HEAD请求方法。res.setHeader(Access-Control-Allow-Methods,*)而这个代码则允许所有的 HTTP 请求方法。2.3 Access-Control-Allow-Credentials当客户端跨域请求需要携带凭证信息如 Cookie、HTTP 认证数据等时服务器需要通过该响应头明确允许携带凭证。Access-Control-Allow-Credentials: true例如res.setHeader(Access-Control-Allow-Credentials,true)该字段的值只能是 true 表示允许跨域请求携带凭证。注当设置该字段为 true 时 Access-Control-Allow-Origin 不能使用通配符 *必须指定具体的源地址。2.4 Access-Control-Allow-Headers当客户端请求中包含自定义请求头非简单请求头时服务器需要通过该响应头部指明允许的请求头字段。格式Access-Control-Allow-Headers: header-name[, header-name]*可以通过 res.setHeader(Access-Control-Allow-Headers,header-name,header-name)来设置。例如res.setHeader(Access-Control-Allow-Headers, Content-Type,Authorization,X-Requested-With)其中header-name 为允许的请求头名称多个请求头之间用逗号分隔。该配置用于告知浏览器服务器允许客户端在请求中使用这些头部字段。对于大多数情况直接使用 app .use(cors()) 的默认配置就足够了无需手动设置这些头部。上一篇引流在上一篇 《SQL完整入门指南基础语法实战技巧安全规范》 中我们系统讲解了SQL语法基础、数据操作、模糊查询与安全规范。本篇所有关于数据库的操作都是建立在这些扎实的SQL基础之上的。如果你对文中的SQL语句还感到陌生强烈建议先阅读上一篇让你的学习之路更加顺畅