node开发一个接口详细步骤

最近在作后台系统改版,因为目前接口还没出来,就本身用nodejs写了个简单的接口。前端

我这里用的是nodejs+mysql的
node

这里不讲nodejs和mysql的安装。这些基础略过。
mysql

首先建立文件夹。cd 进入文件。

npm init 进行初始化

安装下面的包sql

npm install body-parser express mysql cors -S

这里下载mysql是操做mysql数据库的一个js插件,并非数据库软件数据库

下面一步步进行操做express

文章最后也展现出来了页面最后效果。不想一步步跟着作的,能够直接看文章最后,固然仍是但愿你们跟着走一遍,能够加深印象。npm

首先建立程序的入口文件 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对象的形式返回去json

res.send 以也页面的形式返回去后端

res.download以文件的方式返回去,前端请求会下载此文api

运行 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"
  }
}

欢迎你们指出问题。共勉!、 下一篇具体实现登陆、注册、修改密码、删除用户功能

相关文章
相关标签/搜索