最近在作后台系统改版,因为目前接口还没出来,就本身用nodejs写了个简单的接口。前端
我这里用的是nodejs+mysql的
node
这里不讲nodejs和mysql的安装。这些基础略过。
mysql
首先建立文件夹。cd 进入文件。
npm init 进行初始化
安装下面的包sql
npm install body-parser express mysql cors -S
这里下载mysql是操做mysql数据库的一个js插件,并非数据库软件数据库
下面一步步进行操做express
文章最后也展现出来了页面最后效果。不想一步步跟着作的,能够直接看文章最后,固然仍是但愿你们跟着走一遍,能够加深印象。npm
const express = require('express') const app = express() app.listen(8088, () => { console.log('服务启动') }) app.get('/', (req, res) => { res.send('<div>hello world</div>') }) 件
res.json 以json对象的形式返回去json
res.send 以也页面的形式返回去后端
res.download以文件的方式返回去,前端请求会下载此文api
在package.json中配置 "start": "hotnode index.js" hotnode 须要安装 npm i hotnode -g hotnode而后运行 npm start就能够了 这个插件可让你的node程序热更新 固然 nodemon index.js也能够 nodemon 也须要安装 npm i nodemon -g
app.post('/login', (req, res) => { res.json('<div>hello login</div>') }) app.post('/text', (req, res) => { res.json('<div>hello text</div>') })
post不支持浏览器直接访问,这个时候要用postman软件
let login = false; //若是未登陆,返回未登陆,不然,继续向下匹配,回调函数接收三个参数,最后一个是next,继续向下执行,路径必定要写在最上面,否则会先被test捕捉到,test没有执行next,就会捕捉不到请求。 app.all('*', (req, res, next) => { if(!login) return res.json('未登陆') next() }) app.post('/test', (req, res) => { res.json('test') })
const express = require('express') const app = express() // 解析参数 const bodyParser = require('body-parser') let login = true; // json请求 app.use(bodyParser.json()) // 表单请求 app.use(bodyParser.urlencoded({extended: false})) app.listen(8088, () => { console.log('服务启动') }) // 若是未登陆,返回未登陆,不然,继续向下匹配,回调函数接收三个参数,最后一个是next,继续向下执行,路径必定要写在最上面,否则会先被test捕捉到,test没有执行next,就会捕捉不到请求。 app.all('*', (req, res, next) => { if(!login) return res.json('未登陆') next() }) app.post('/test:data', (req, res) => { return res.json({query: req.query, data: req.params, json: req.body}) })
const cors = require('cors') app.use(cors)// 解决跨域
我目前尚未用到,因此代码中还未引入
const mysql = require('mysql') const option = { host: 'localhost', user: 'root', password: 'root', port: '3306', database: 'nodecms', connectTimeout: 5000, //链接超时 multipleStatements: false //是否容许一个query中包含多条sql语句 } const conn = mysql.createConnection(option); app.post('/login', (req, res) => { conn.query("SELECT * FROM students", (e, r) => { res.json(new Result({ data: r })) }) }) function Result ({ code = 1, msg = '', data = {} }) { this.code = code; this.msg = msg; this.data = data; }
这里只贴出来了要新增的部分
let conn; reconn(); // 断线重连机制 function reconn() { conn = mysql.createConnection({ option }) conn.on('error', err => { err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(reconn, 2000) }) }
这里只贴出来了要修改的部分 上面一部分改成如下部分
let pool; repool() app.get('/login', (req, res) => { pool.getConnection((err, conn) => { conn.query("SELECT * FROM students", (e, r) => { if(e) throw error res.json(new Result({ data: r })) }) pool.releaseConnection(conn) // 释放链接池,等待别的链接使用 }) }) // 断线重连机制 function repool() { // 建立链接池 pool = mysql.createPool({ ...option, waitForConnections: true, //当无链接池可用时,等待(true)仍是抛错(false) connectionLimit: 100, //链接数限制 queueLimit: 0 //最大链接等待数(0为不限制) }) pool.on('error', err => { err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(repool, 2000) }) app.all('*', (_,__, next) => { pool.getConnection( err => { err && setTimeout(repool, 2000) || next() }) }) }
connect.js
const mysql = require('mysql') const express = require('express') const app = express() const router = express.Router(); // 解析参数 const bodyParser = require('body-parser') let login = true; // json请求 app.use(bodyParser.json()) // 表单请求 app.use(bodyParser.urlencoded({extended: false})) const option = { host: 'localhost', user: 'root', password: 'root', port: '3306', database: 'nodecms', connectTimeout: 5000, //链接超时 multipleStatements: false //是否容许一个query中包含多条sql语句 } let pool; repool() function Result ({ code = 1, msg = '', data = {} }) { this.code = code; this.msg = msg; this.data = data; } // 断线重连机制 function repool() { // 建立链接池 pool = mysql.createPool({ ...option, waitForConnections: true, //当无链接池可用时,等待(true)仍是抛错(false) connectionLimit: 100, //链接数限制 queueLimit: 0 //最大链接等待数(0为不限制) }) pool.on('error', err => { err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(repool, 2000) }) app.all('*', (_,__, next) => { pool.getConnection( err => { err && setTimeout(repool, 2000) || next() }) }) } module.exports = { app, pool, Result, router }
router/login.js
const { pool, router, Result } = require('../connect') router.get('/', (req, res) => { pool.getConnection((err, conn) => { conn.query("SELECT * FROM students", (e, r) => { if(e) throw error res.json(new Result({ data: r })) }) pool.releaseConnection(conn) // 释放链接池,等待别的链接使用 }) }) module.exports = router;
入口文件 index.js
const { app, pool, Result } =require('./connect') const login = require('./router/login') app.all('*', (req, res, next) => { //这里处理全局拦截,必定要写在最上面 next() }) app.all('/', (req, res) => { pool.getConnection((err, conn) => { res.json({ type: 'test'}) pool.releaseConnection(conn) // 释放链接池,等待别的链接使用 }) }) app.use('/login', login) app.listen(8088, () => { console.log('服务启动') })
package.json
{ "name": "api", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "hotnode index.js" }, "author": "yxf", "license": "ISC", "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", "express": "^4.17.1", "mysql": "^2.17.1" } }
欢迎你们指出问题。共勉!、 下一篇具体实现登陆、注册、修改密码、删除用户功能