最近在作後臺系統改版,因爲目前接口還沒出來,就本身用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" } }
歡迎你們指出問題。共勉!、 下一篇具體實現登陸、註冊、修改密碼、刪除用戶功能