最近在做后台系統改版,由於目前接口還沒出來,就自己用nodejs寫了個簡單的接口。
我這里用的是nodejs+mysql的
這里不講nodejs和mysql的安裝。這些基礎略過。
首先創建文件夾。cd 進入文件。
npm init 進行初始化
安裝下面的包
npm install body-parser express mysql cors -S
這里下載mysql是操作mysql數據庫的一個js插件,並不是數據庫軟件
下面一步步進行操作
文章最后也展示出來了頁面最后效果。不想一步步跟着做的,可以直接看文章最后,當然還是希望大家跟着走一遍,可以加深印象。
首先創建程序的入口文件 index.js
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對象的形式返回去
res.send 以也頁面的形式返回去
res.download以文件的方式返回去,前端請求會下載此文
運行 server.js測試get請求
在package.json中配置 "start": "hotnode index.js"
hotnode 需要安裝
npm i hotnode -g
hotnode然后運行 npm start就可以了
這個插件可以讓你的node程序熱更新
當然 nodemon index.js也可以
nodemon 也需要安裝 npm i nodemon -g
接着測試post:
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})
})
如需要前后端聯調,需要用到跨域中間件cors:
const cors = require('cors')
app.use(cors)// 解決跨域
我目前還沒有用到,所以代碼中還未引入
開始連接數據庫
首先mysql建一個表students,存入以下數據
然后使用mysql插件連接數據庫
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"
}
}
歡迎大家指出問題。共勉!、
下一篇具體實現登錄、注冊、修改密碼、刪除用戶功能