首页 > 编程语言 >node开发一个接口详细步骤

node开发一个接口详细步骤

时间:2023-10-26 18:15:03浏览次数:32  
标签:node const 步骤 app mysql 接口 json res pool

最近在做后台系统改版,由于目前接口还没出来,就自己用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"
  }
}

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

标签:node,const,步骤,app,mysql,接口,json,res,pool
From: https://www.cnblogs.com/lylsr/p/17790027.html

相关文章

  • node+mysql+express实现登录/注册/修改密码/删除用户 接口
    实现用户的注册、登录、修改密码、删除用户操作用到的数据库:nodecms;表:user目录结构:db目录下存放数据库操作语句:userSQL.js用户有关的操作语句router目录接口路由文件user.js用户接口路由connect.js数据库连接index.html前端测试页面index.js入口文件package.js......
  • 使用fluent api调用https接口时忽略证书异常
    不知道为啥,中文互联网对脱胎于httpclient的fluentapi介绍太少了,遇到问题也不知道怎么查,只能自己研究,于是遇到问题赶紧记下来一般情况下我们使用fluent的get方法调用http接口的方式是这样的Request.get(url).connectTimeout(Timeout.ofMilliseconds(5000)).e......
  • MySQL连接字符串的实际操作步骤汇总
    MySQL连接字符串的实际操作步骤汇总MySQL字符串主要向大家描述的是MySQL连接字符串的实际操作步骤汇总,其中包括MySqlConnector/ODBC2.50(MyODBC2.50)连接方式,MySQLConnector/ODBC3.51(MyODBC3.51)连接方式等相关内容的具体描述。一、MySQLConnector/ODBC2.50(MyODB......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(二
    具体操作步骤接下来以一个制造旋转效果的shader为例子,提供了这些参数的设置:旋转速度float旋转中心位置vec2逆时针/顺时针bool扭曲度float并在使用的贴图一致的前提下并且参数不同的值都能够合批。最终项目可以从GITHUB获取。CCC版本:3.8.0深入了解可以阅读后续......
  • 「实用技巧」后端如何使用 Eolink Apikit 快速调试接口?
    程序员最讨厌的两件事:写文档别人不写文档写文档、维护文档比较麻烦,而且费时,还会经常出现API更新了,但文档还是旧的,各种同步不一致的情况,从而耽搁彼此的时间,大多数开发人员不愿意写API文档。EolinkApikit为后端工程师提供API文档的创建与自动化生成、快速接口调试、以......
  • Centos7.0安装.core5.0步骤
    在线安装:1.将Microsoft包签名密钥添加到受信任密钥列表,并添加Microsoft包存储库:sudorpm-Uvhhttps://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm2.安装Asp.netCore运行时:sudoyuminstallaspnetcore-runtime-5.03.安装sdk:sudoyuminstal......
  • nssm注册服务步骤
    第一步下载nssm工具,下载地址:http://nssm.cc/release/nssm-2.24.zip解压后,文件里面有32位和64位:    电脑系统是64位的,就打开64文件夹进入到nssm的目录,地址栏输入cmd回车执行 3、执行服务安装,运行命令,打开了程序界面 复制 nssminstall 执行 4、配置应用程序......
  • 【nvm】关于自动切换Node版本的解决方案
    本地会开发多个不同的NodeJS项目,每个项目可能需要的Node版本不同,有的老项目还在用10.xx,有的要求12.xx/14.xx/16.xx/18.xx。总之,每个项目都需要不同的Node版本。很多时候我都是在启动项目遇到报错了才会意识到要切换Node版本。于是我开始搜寻关于多项目自动切换Node......
  • 【示波器的原理,使用方法和基本操作步骤】
    简介:示波器入门非常简单,使用AutoScale(自动定标)功能,能轻易的捕捉波形。入门级的AutoScale所采用的“边沿触发”,通过查找波形上的指定沿(上升沿或下降沿等)和电压电平来识别触发。TriggerLevel(触发电平)示波器作用:用来观察和分析电信号的各种特性(包括频率、幅度、相位、波形......
  • centos7安装node-v18版本真是难呢
    背景背景就是上一篇文章提到的,部署gitbook这个文档中心的话,是需要先安装node,然后,如果你的node版本过高的话,一般会报错,此时,网上很多文章就是降node版本解决,但其实用高版本也是有办法的,只是麻烦点,要改改代码;但是,我下载了高版本的node安装时,发现在centos7上还装不了,可谓一波未平一波......