node開發一個接口詳細步驟


最近在做后台系統改版,由於目前接口還沒出來,就自己用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"
  }
}

歡迎大家指出問題。共勉!、
下一篇具體實現登錄、注冊、修改密碼、刪除用戶功能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM