龙空技术网

基于MySql数据库+Express的API接口服务(含服务器部署)

拥抱每一天 942

前言:

今天小伙伴们对“基于mysql”大体比较关怀,各位老铁们都需要知道一些“基于mysql”的相关知识。那么小编在网上搜集了一些有关“基于mysql””的相关内容,希望看官们能喜欢,我们快快来了解一下吧!

一、用到的技术点第三方包express和mysql2ES6模块化Promiseasync/await二、主要实现步骤搭建项目基本结构

①新建文件夹,使用node初始化项目,并在package.json中声明"type":"module"使之支持ES6模块化npm init -y②安装第三方依赖npm install express@4.17.1 mysql2@2.2.5

//package.json{  "type":"module",  "name": "api",  "version": "1.0.0",  "description": "",  "main": "index.js",  "scripts": {    "test": "echo \"Error: no test specified\" && exit 1"  },  "keywords": [],  "author": "",  "license": "ISC"}

2. 创建基本的服务器

在项目的根目录下创建一个app.js文件,在其中导入express模块,并绑定监听端口号,在终端运行命令:node ./app.js
//app.jsimport express from 'express'const app =  express()app.listen(8081,()=>{    console.log("服务已经启动。。。");})

输入命令后看见如下则说明服务已经启动:

3. 创建db数据库操作模块

在项目根目录下创建db文件夹,在其中创建index.js,导入mysql2模块并定义数据源。
//index.jsimport mysql from 'mysql2'const pool = mysql.createPool({    host:'127.0.0.1',    port:3306,    database:'sys',//数据库名称    user:'root',//用户名    password:'123456'//密码})//使用默认导出,将数据库对象暴露出去  这里导出它的promiseexport default pool.promise()

4. 创建controller模块

在项目根目录创建controller文件夹,在其中新建control.js,导入刚才创建的db模块,并进行相应的数据库操作。
//control.jsimport db from "../db/index.js";//定义一个获取数据列表的函数//将函数按需导出//由于我们之前的db返回的是promise对象,所以我们使用async/await来简化export async function getInfo(req, res) {  //这里可以进行一个异常捕获  try {    const [rows] = await db.query("select * from sys_config");    //构建响应数据    res.send({      status: 200,      msg: "获取成功",      data: rows,    });  } catch (error) {    //构建响应数据    res.send({      status: 500,      msg: "获取失败",      data: error.message,    });  }}

5. 创建router模块

在项目根目录下创建router文件夹,在其中创建router.js,需要按需导入上一步创建的getInfo函数,并创建路由对象和定义挂载路由的规则。
//router.jsimport  express  from "express";//按需导入getInfo函数import { getInfo } from "../controller/control.js";//创建路由对象const router = new express.Router()//挂载路由对象  /info代表访问路径router.get('/info',getInfo)//将路由对象导出export default router

6. 在app.js中导入并挂载路由模块

在app.js中导入并挂载路由模块,并重启服务
//app.jsimport express from 'express'//导入路由模块import router from './router/router.js';const app =  express()//挂载路由对象  '/api'用来设置默认访问前缀,如router模块中定义了'/info',那么访问路径就是'/api/info'app.use('/api',router)app.listen(8081,()=>{    console.log("服务已经启动。。。");})

7. 补充

想要修改代码后自动编译,可以使用nodemon ./app.js如果没有安装nodemon 可以使用命令npm install nodemon -g进行全局安装

8. 测试

打开浏览器,输入:如果出现以下数据,说明该api在本地已经可以成功访问。如果访问不到,请检查自己的数据库名称,用户名和密码是否正确。

火狐访问

谷歌访问

三、将写好的API部署到服务器

要想将API部署到服务器,首先得有自己的服务器。这个看大家的需求自行购买。

以腾讯云的宝塔面板进行演示。

安装PM2管理工具

2. 上传数据库备份文件

注意:数据库名字和用户名随便取,但是会有校验规则,像什么root之类的是不允许取的

选择导入,从本地上传数据库备份文件,也就是上面步骤中用到的数据库。

上传之后一定要选择导入

3. 将本地文件上传到服务器

文件上传的路径是任意的,比如我在wwwroot目录下新建了api文件夹,然后进入api文件夹,点击上传,将本地刚才创建的api文件夹中的所有内容上传。

4. 修改数据库的连接

因为服务器上的数据库名字和用户名和本地创建的时候是不一致的,所以要修改成服务器上的用户名和数据库名字。修改服务器上db/index.js:

import mysql from 'mysql2'const pool = mysql.createPool({    host:'127.0.0.1',    port:3306,    database:'test111',    user:'test111',    password:'123456'})export default pool.promise();

5. 配置PM2管理工具

选择模块下的管理

设置监听端口

在安全中放行8081端口

同时在防火墙放行8081端口

重启服务,用ip+端口号进行访问

如果能成功访问如上页面,说明API部署成功。

6. 跨域问题

我们写一个index.htm,点击按钮来获取一下服务器的API接口

<!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>api测试</title>  </head>  <body>    <button onclick="getInfo()">点击获取数据</button>    <div id="content"></div>  </body>  <script>    function getInfo() {      var xhr = new XMLHttpRequest(); //这里没有考虑IE浏览器,如果需要择if判断加      xhr.open("GET", "http://你的ip:8081/api/info", true);      xhr.send(null);      xhr.onreadystatechange = function (data) {        if (xhr.status === 200 && xhr.readyState === 4) {           document.getElementById('content').innerText = data.currentTarget.responseText        }      };    }  </script></html>

我们点击按钮发现出现跨域错误

解决方式:

在app.js中加入如下代码,然后重启PM2管理工具:

import express from 'express'//导入路由模块import router from './router/router.js';const app =  express()//本地服务器解决跨域,不可缺app.all('*', function (req, res, next) {    res.header('Access-Control-Allow-Origin', '*');    //Access-Control-Allow-Headers ,可根据浏览器的F12查看,把对应的粘贴在这里就行    res.header('Access-Control-Allow-Headers', 'Content-Type');    res.header('Access-Control-Allow-Methods', '*');    res.header('Content-Type', 'application/json;charset=utf-8');    next();  });//挂载路由对象  '/api'用来设置默认访问前缀,如router模块中定义了'/info',那么访问路径就是'/api/info'app.use('/api',router)app.listen(8081,()=>{    console.log("服务已经启动。。。");})

再次点击按钮,成功获取到返回的json数据:

至此,基于node模块化的api编写及部署就结束了。大家在学习开发的过程中就可以自己写接口来测试了。

标签: #基于mysql