关于后端:快速上手用node进行API接口搭建

17次阅读

共计 4299 个字符,预计需要花费 11 分钟才能阅读完成。

1、前置环境部署

  1. 装置 node,请自行百度
  2. 创立一个文件夹搁置 node 我的项目
  3. 在新建的 node 文件夹中执行 npm init, 文件会生成一个 package.json 的文件
  4. 装置 express 框架, 及相干依赖

    npm install express
    npm install body-parser
    npm install cors –save

  5. 创立相干文件目录

    • db 文件夹:搁置数据库操作语句(.js 文件)
    • router 文件夹:搁置接口文件(.js 文件)
    • connect.js 文件:链接数据库前端等相干操作
    • index.js 文件:主文件,援用各个文件,拦挡申请,后端路由

2、connect.js

const mysql = require('mysql')
const express = require('express')
const app = express()
const router = express.Router();
const cors = require('cors');  // 跨域
// 引入 express-session 模块并设置中间件,做登录验证等须要操作 session 和 cookie 须要引入的模块
const session = require("express-session");
const cookieParser=require("cookie-parser")
app.use(cors());
// 解析参数
const bodyParser = require('body-parser')
// json 申请
app.use(express.json())
// 表单申请
app.use(express.urlencoded({extended: false}))
// 设置 session 和 cookie 配置项
app.use(cookieParser());
app.use(
  session({
    secret:'keyboard cat',  // 服务端生成申明可随便写
    resave:true,      // 强制保留 session 即便他没有什么变动
    saveUninitialized:true,   // 强制未来初始化的 session 存储
    cookie:{  // session 是基于 cookie 的,所以能够在配置 session 的时候配置 cookie
      maxAge:1000*60*30,  // 设置过期工夫
      secure:false      // true 的话示意只有 https 协定能力拜访 cookie
     }
}))
/**
 * 配置 mysql
 */
const option = {
 host: 'localhost',
 user: '*****',
 password: '*****',
 port: '3306',
 database: '*****',
 connectTimeout: 5000, // 连贯超时
 multipleStatements: false // 是否容许一个 query 中蕴含多条 sql 语句
}

/**
 * 设置申请头,解决跨域
 */
var allowCors = function(req, res, next) {res.header("Access-Control-Allow-Origin", req.headers.origin); // 设置容许来自哪里的跨域申请拜访(req.headers.origin 为以后拜访起源的域名与端口)res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS"); // 设置容许接管的申请类型
  res.header("Access-Control-Allow-Headers", "Content-Type,request-origin"); // 设置申请头中容许携带的参数
  res.header("Access-Control-Allow-Credentials", "true"); // 容许客户端携带证书式拜访。放弃跨域申请中的 Cookie。留神:此处设 true 时,Access-Control-Allow-Origin 的值不能为 '*'
  res.header("Access-control-max-age", 1000); // 设置申请通过预检后多少工夫内不再测验,缩小预申请发送次数
  next();};
app.use(allowCors);
let pool;
repool()

// 解决接口返回数据,标准返回格局
function Res ({code = 200, msg = '', data = {} }) {
  this.code = code;
  this.msg = msg;
  this.data = data;
}
function resJson (_res, result) {if(result){return _res.json(new Res(result))
  }else{return}

}
// 断线重连机制
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, router, resJson}

3、db 文件夹(sql 操作语句)

const SQL = {
  queryAll: 'select * from biaoming order by si asc',   // 查问并升序排序
  updateArt: 'update biaoming set si=? where si=?',// 更改
  deleteArt: 'delete from biaoming where si=?', // 删除
  addArt: 'insert into biaoming values (?,?,?,?,?,?)', // 增加
  queryByIndex: 'select * from biaoming where si=?',  // 序号索引查问
  queryByLike: 'select * from biaoming where title like ?' // 含糊查问
}

module.exports = SQL

4、router 文件夹(接口文件)

// 导入相干模块,本文以登陆性能为例, 带参申请 http://localhost:8088/user/login?name=yourval&password=yourval
const {pool, router, resJson} = require('../connect')
const userSQL = require('../db/userSQL')
const stringRandom = require('string-random'); // 生成随机数,用于登录验证

 /**
 * 登录
 */
router.get('/login', (req, res) => {   // 本地接口门路 http://localhost:8088/user/login
  let user = {
    username: req.query.name,
    password: req.query.password
  }
  let _res = res;

  // 判断参数是否为空
  if (!user.username) {
    return resJson(_res, {
        code: -1,
        msg: '用户名不能为空'
    })
  }
  if (!user.password) {
    return resJson(_res, {
        code: -1,
        msg: '明码不能为空'
    })
  }

  let _data;
  const sessran = stringRandom(16, { numbers: true})
  var usersess = req.session;
  // 从连接池获取连贯
  pool.getConnection((err, conn) => { // 数据库链接
    conn.query(userSQL.queryByNamePassword, [user.username, user.password], (e, result) => { // 操作数据库
        if (e) _data = {
            code: -1,
            msg: e
        }
        // 通过用户名和明码索引查问数据,有数据阐明用户存在且明码正确,只能返回登录胜利,否则返回用户名不存在或登录明码谬误
        if (result && result.length) {
            _data = {
                msg: '登录胜利',
                data: {
                    userInfo: {session: sessran}
                }
            }
            req.session.userinfo = sessran; // 设置 session
        } else {
            _data = {
                code: -1,
                msg: '用户名不存在或登录明码谬误'
            }
        }
        setTimeout(() => {
            // 把操作后果返回给前台页面
            resJson(_res, _data)
        }, 500);
    })
    pool.releaseConnection(conn) // 开释连接池,期待别的连贯应用
  })
})
module.exports = router;

5、index.js 入口文件

const {app, pool} =require('./connect')
const user = require('./router/user')
const page = require('./router/page')

// 这里解决全局拦挡,肯定要写在最下面
app.all('*', (req, res, next) => {next()
})

// 首页路由
app.get('/', (req,res) => {res.sendFile(__dirname+'/'+'index.html')
})
app.all('/', (req, res) => {pool.getConnection((err, conn) => {res.json({ type: 'test'})
    pool.releaseConnection(conn) // 开释连接池,期待别的连贯应用
  })
})

app.use('/user', user)
app.use('/page', page)

// 运行端口
app.listen(8088, () => {console.log('服务启动','localhost:8088')
})


6、启动服务

node index.js

正文完
 0