node搭建API接口平台学习笔记

学习链接:https://www.bilibili.com/video/BV1A7411N7KZ?p=1

一、初始化项目

1、安装node、npm、express。
//查看版本
node -v
npm -v
express --version
//express安装方法
npm install express -g
npm install -g express-generator //4.X版本,把generator分离出来了,需要单独安装
2、执行“express [项目名]”,即可创建一个新的express项目。
//例如express apiLearn创建一个命名为apiLearn的项目。
express apiLearn
3、进入项目根目录,执行“npm install”安装相关依赖。
npm install
4、启动项目。
npm start
//↓↓↓ 也可这样启动
node ./bin/www
5、默认端口是3000,此时可成功访问“localhost:3000”。

二、数据库的连接与测试

1、改写入口文件,默认在bin目录下的www文件,现在要改成app.js。改写完成后,可删除bin目录。
//在app.js里添加
var http = require('http');
var server = http.createServer(app);
//在app.js最后添加监听3000端口
server.listen('3000');
2、重新启动项目。
//注意:改写完成后,不能再使用node ./bin/www启动项目。
node app.js
3、安装MySQL模块。
npm install mysql --save
4、创建数据库,添加数据表cate并插入数据。

在这里插入图片描述
在这里插入图片描述

5、在根目录下创建util目录,在util目录下创建dbconfig.js文件。
6、编辑dbconfig.js文件。
const mysql = require('mysql');
const {
    
     connect } = require('../routes');
module.exports = {
    
    
    //数据库配置
    config: {
    
    
        host: 'localhost',
        port: '3306',
        user: 'root',
        password: 'Luo1998==',
        database: 'exapp',
    },
    //连接数据库,使用MySQL的连接池连接方式
    //连接池对象
    sqlConnect: function (sql, sqlArr, callBack) {
    
    
        var pool = mysql.createPool(this.config)
        pool.getConnection((err, conn) => {
    
    
            console.log('12345')
            if (err) {
    
    
                console.log('连接失败');
                return;
            }
            //事件驱动回调
            conn.query(sql, sqlArr, callBack);
            //释放连接
            conn.release();
        })
    }
}
7、修改routes目录下的index.js文件。
var express = require('express');
var router = express.Router();
var dbConfig = require("../util/dbconfig")

/* GET home page. */
router.get('/', function (req, res, next) {
    
    
  var sql = "select * from cate";
  var sqlArr = [];
  var callBack = (err, data) => {
    
    
    if (err) {
    
    
      console.log("连接出错了");
    } else {
    
    
      res.send({
    
    
        "list": data
      })
    }
  }
  dbConfig.sqlConnect(sql, sqlArr, callBack);
  // res.render('index', { title: 'Express' });
});

module.exports = router;
8、热启动。它的作用是监听代码文件的变动,当代码改变之后,保存即可自动重启。
//安装热启动工具
npm install nodemon -g
//使用热启动工具
nodemon app.js
9、重新启动项目,访问“localhost:3000”即可得到以下页面。

在这里插入图片描述

三、请求方法的封装

1、在根目录下创建controllers目录,在controllers目录下创建cateController.js文件。
2、编辑cateController.js文件。
var dbConfig = require("../util/dbconfig")
//获取分类
getCate = (req, res) => {
    
    
    var sql = "select * from cate";
    var sqlArr = [];
    var callBack = (err, data) => {
    
    
      if (err) {
    
    
        console.log("连接出错了");
      } else {
    
    
        res.send({
    
    
          "list": data
        })
      }
    }
    dbConfig.sqlConnect(sql, sqlArr, callBack);
}
module.exports = {
    
    
    getCate
}
3、修改routes目录下的index.js文件。
var express = require('express');
var router = express.Router();
var cate = require('../controllers/cateController');


/* GET home page. */
router.get('/', cate.getCate);

module.exports = router;
4、启动项目。
nodemon app.js
5、成功访问。

在这里插入图片描述

6、改写app.js文件,删除一些不必要的代码。
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

//改写
var http = require('http');
var server = http.createServer(app);

app.use(express.urlencoded({
    
     extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

server.listen('3000');

四、带参数获取列表

1、创建数据表post并添加数据。

在这里插入图片描述
在这里插入图片描述

2、编辑controllers目录下cateController.js文件。
var dbConfig = require("../util/dbconfig")
//获取分类
getCate = (req, res) => {
    
    
    var sql = "select * from cate";
    var sqlArr = [];
    var callBack = (err, data) => {
    
    
        if (err) {
    
    
            console.log("连接出错了");
        } else {
    
    
            res.send({
    
    
                "list": data
            })
        }
    }
    dbConfig.sqlConnect(sql, sqlArr, callBack);
}
//获取指定分类的文章列表
getPostCate = (req, res) => {
    
    
    let {
    
     id } = req.query;
    var sql = `select * from post where cate_id=?`;
    var sqlArr = [id];
    var callBack = (err, data) => {
    
    
        if (err) {
    
    
            console.log("连接出错了");
        } else {
    
    
            res.send({
    
    
                "list": data
            })
        }
    }
    dbConfig.sqlConnect(sql, sqlArr, callBack);
}
module.exports = {
    
    
    getCate,
    getPostCate
}
3、修改routes目录下的index.js文件。
var express = require('express');
var router = express.Router();
var cate = require('../controllers/cateController');


/* GET home page. */
router.get('/', cate.getCate);
router.get('/getPostCate', cate.getPostCate);

module.exports = router;
4、打开Postman验证接口,验证结果如下,成功!

在这里插入图片描述

五、模拟验证码接口

1、创建数据表user。

在这里插入图片描述

2、在controllers目录下创建userController.js文件,编辑userController.js文件,编写模拟验证码接口。
//随机四位数验证码
function rand(min, max) {
    
    
    return Math.floor(Math.random() * (max - min)) + min;
}

//模拟验证码发送接口
sendCode = (req, res) => {
    
    
    let phone = req.body.user_phone;
    let code = rand(1000, 9999);
    res.send({
    
    
        'code': 200,
        'msg': '发送成功'
    })
    console.log(code)
}

module.exports = {
    
    
    sendCode
}
3、修改routes目录下的users.js文件。
var express = require('express');
var router = express.Router();
var User = require('../controllers/userController');

/* GET users listing. */
router.post('/sendCode', User.sendCode);

module.exports = router;
4、打开Postman验证接口,验证结果如下,成功!控制台也成功返回四位数验证码“5911”。

在这里插入图片描述
在这里插入图片描述

六、验证码登录接口

1、由于需要使用post请求,所以先安装body-parser插件。
npm install body-parser --save
2、在app.js里引入注册插件。
var createError = require('http-errors');
var express = require('express');
const bodyParser = require('body-parser'); //修改部分
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

//改写
var http = require('http');
var server = http.createServer(app);

app.use(express.urlencoded({
    
     extended: false }));
app.use(cookieParser());
//静态资源
app.use(express.static(path.join(__dirname, 'public')));
//post请求
app.use(bodyParser.urlencoded({
    
     extended: true })); ///修改部分

app.use('/', indexRouter);
app.use('/users', usersRouter);

server.listen('3000');
3、编辑controllers目录下的userController.js文件,增加验证码登录接口。
//随机四位数验证码
function rand(min, max) {
    
    
    return Math.floor(Math.random() * (max - min)) + min;
}

//检验该手机号是否发过验证码
let validatePhoneCode = [];
let sendCodeP = (phone) => {
    
    
    for (let item of validatePhoneCode) {
    
    
        if (phone == item.phone) {
    
    
            return true;
        }
    }
    return false;
}

let findCodeAndPhone = (phone, code) => {
    
    
    for (let item of validatePhoneCode) {
    
    
        if (phone == item.phone && code == item.code) {
    
    
            return 'login';
        }
        return 'error';
    }
}

//模拟验证码发送接口
sendCode = (req, res) => {
    
    
    let phone = req.query.phone;
    if (sendCodeP(phone)) {
    
    
        res.send({
    
    
            'code': 400,
            'msg': '已经发送过验证码,稍后再发'
        })
    }
    let code = rand(1000, 9999);
    validatePhoneCode.push({
    
    
        'phone': phone,
        'code': code
    })
    console.log(validatePhoneCode);
    res.send({
    
    
        'code': 200,
        'msg': '发送成功'
    })
    console.log(code)
}

//验证码登录接口
codePhoneLogin = (req, res) => {
    
    
    let {
    
     phone, code } = req.query;
    //该手机号是否发过发过验证码
    if (sendCodeP(phone)) {
    
    
        //验证码和手机号是否匹配
        let status = findCodeAndPhone(phone, code);
        if (status == 'login') {
    
    
            //登录成功
            //登录成功之后的操作
            res.send({
    
    
                'code': 200,
                'msg': '登录成功'
            })
        } else if (status == 'error') {
    
    
            res.send({
    
    
                'code': 200,
                'msg': '登录失败'
            })
        }
    } else {
    
    
        res.send({
    
    
            'code': 400,
            'msg': '未发送验证码'
        })
    }

}

module.exports = {
    
    
    sendCode,
    codePhoneLogin
}
4、编辑routes目录下的user.js文件,为新接口注册路由。
var express = require('express');
var router = express.Router();
var User = require('../controllers/userController');

/* GET users listing. */
router.post('/sendCode', User.sendCode);
router.post('/codePhoneLogin', User.codePhoneLogin) //修改部分

module.exports = router;
5、打开Postman验证接口,发送验证码成功,使用验证码登录成功!

发送验证码
验证码
使用验证码登录成功

七、阿里大鱼接口准备

1、安装@alicloud/pop-core。
npm install @alicloud/pop-core --save
2、申请阿里大鱼短信服务,申请签名和模板(签名和模板需要审核)。

阿里大鱼短信服务:https://www.aliyun.com/product/sms?spm=5176.10695662.1128094.3.2a6b4beeO2x0Ji

3、在AccessKey 管理里创建AccessKey 。

AccessKey 管理:https://ram.console.aliyun.com/manage/ak?spm=5176.12438469.nav-right.dak.aa2b1cbe2gd2OZ
在这里插入图片描述

八、阿里大鱼短信认证接口

1、在util目录下创建aliconfig.js文件,编辑aliconfig.js文件。
module.exports = {
    
    
    alicloud: {
    
    
        'accessKeyId': '填上自己的accessKeyId',
        'accessKeySecret': '填上自己的accessKeySecret',
        'endpoint': 'https://dysmsapi.aliyuncs.com',
        'apiVersion': '2017-05-25'
    }
}
2、编辑controllers目录下的userController.js文件。
//调用阿里大鱼
const Core = require('@alicloud/pop-core')
const config = require('../util/aliconfig')
//配置
let client = new Core(config.alicloud);
let requestOption = {
    
    
    method: 'POST'
}
//随机四位数验证码
function rand(min, max) {
    
    
    return Math.floor(Math.random() * (max - min)) + min;
}

//检验该手机号是否发过验证码
let validatePhoneCode = [];
let sendCodeP = (phone) => {
    
    
    for (let item of validatePhoneCode) {
    
    
        if (phone == item.phone) {
    
    
            return true;
        }
    }
    return false;
}

//手机号和验证码是否匹配
let findCodeAndPhone = (phone, code) => {
    
    
    for (let item of validatePhoneCode) {
    
    
        if (phone == item.phone && code == item.code) {
    
    
            return 'login';
        }
        return 'error';
    }
}

//真实验证码发送接口
sendCoreCode = (req, res) => {
    
    
    let phone = req.query.phone;
    let code = rand(1000, 9999);
    var params = {
    
    
        "RegionId": "cn-hangzhou",
        "PhoneNumbers": phone,
        "SignName": "ABC商城",
        "TemplateCode": "SMS_205122358",
        "TemplateParam": JSON.stringify({
    
     "code": code })
    };
    client.request('SendSms', params, requestOption).then((result) => {
    
    
        console.log(result);
        if (result.Code == "OK") {
    
    
            res.send({
    
    
                'code': 200,
                'msg': '发送成功'
            });
            validatePhoneCode.push({
    
    
                'phone': phone,
                'code': code
            });
            console.log(code);
        } else {
    
    
            res.send({
    
    
                'code': 400,
                'msg': '发送失败'
            })
        }
    })
}

//模拟验证码发送接口
sendCode = (req, res) => {
    
    
    let phone = req.query.phone;
    if (sendCodeP(phone)) {
    
    
        res.send({
    
    
            'code': 400,
            'msg': '已经发送过验证码,稍后再发'
        })
    }
    let code = rand(1000, 9999);
    validatePhoneCode.push({
    
    
        'phone': phone,
        'code': code
    })
    console.log(validatePhoneCode);
    res.send({
    
    
        'code': 200,
        'msg': '发送成功'
    })
    console.log(code)
}

//验证码登录接口
codePhoneLogin = (req, res) => {
    
    
    let {
    
     phone, code } = req.query;
    //该手机号是否发过发过验证码
    if (sendCodeP(phone)) {
    
    
        //验证码和手机号是否匹配
        let status = findCodeAndPhone(phone, code);
        if (status == 'login') {
    
    
            //登录成功
            //登录成功之后的操作
            res.send({
    
    
                'code': 200,
                'msg': '登录成功'
            })
        } else if (status == 'error') {
    
    
            res.send({
    
    
                'code': 200,
                'msg': '登录失败'
            })
        }
    } else {
    
    
        res.send({
    
    
            'code': 400,
            'msg': '未发送验证码'
        })
    }

}

module.exports = {
    
    
    sendCode,
    sendCoreCode,
    codePhoneLogin
}
3、编辑routes目录下的user.js文件,为新接口注册路由。
var express = require('express');
var router = express.Router();
var User = require('../controllers/userController');

/* GET users listing. */
router.post('/sendCode', User.sendCode);
router.post('/sendCoreCode', User.sendCoreCode); ///修改部分
router.post('/codePhoneLogin', User.codePhoneLogin)

module.exports = router;
4、打开Postman验证接口,验证结果如下,成功!手机成功收到验证码“7689”,控制台也成功返回四位数验证码“7689”。

在这里插入图片描述

扫描二维码关注公众号,回复: 13099987 查看本文章

在这里插入图片描述

九、使用验证码注册账户(P9+P10+P11)

1、编辑controllers目录下的userController.js文件。
var dbConfig = require("../util/dbconfig")
//调用阿里大鱼
const Core = require('@alicloud/pop-core')
const config = require('../util/aliconfig');
//配置
let client = new Core(config.alicloud);
let requestOption = {
    
    
    method: 'POST'
}
//随机四位数验证码
function rand(min, max) {
    
    
    return Math.floor(Math.random() * (max - min)) + min;
}

//检验该手机号是否发过验证码
let validatePhoneCode = [];
let sendCodeP = (phone) => {
    
    
    for (let item of validatePhoneCode) {
    
    
        if (phone == item.phone) {
    
    
            return true;
        }
    }
    return false;
}

//手机号和验证码是否匹配
let findCodeAndPhone = (phone, code) => {
    
    
    for (let item of validatePhoneCode) {
    
    
        if (phone == item.phone && code == item.code) {
    
    
            return 'login';
        }
        return 'error';
    }
}

//真实验证码发送接口
sendCoreCode = (req, res) => {
    
    
    let phone = req.query.phone;
    let code = rand(1000, 9999);
    var params = {
    
    
        "RegionId": "cn-hangzhou",
        "PhoneNumbers": phone,
        "SignName": "ABC商城",
        "TemplateCode": "SMS_205122358",
        "TemplateParam": JSON.stringify({
    
     "code": code })
    };
    client.request('SendSms', params, requestOption).then((result) => {
    
    
        console.log(result);
        if (result.Code == "OK") {
    
    
            res.send({
    
    
                'code': 200,
                'msg': '发送成功'
            });
            validatePhoneCode.push({
    
    
                'phone': phone,
                'code': code
            });
            console.log(code);
        } else {
    
    
            res.send({
    
    
                'code': 400,
                'msg': '发送失败'
            })
        }
    })
}

//检测验证码登录是否是第一次登录
let phoneLoginBind = async (phone) => {
    
    
    let sql = "select * from user where username=? or phone=?";
    let sqlArr = [phone, phone];
    let res = await dbConfig.SySqlConnect(sql, sqlArr);
    if (res.length) {
    
    
        res[0].userinfo = await getUserInfo(res[0].id);
        return res;
    } else {
    
    
        //用户第一次注册,绑定表
        let res = await regUser(phone);
        //获取用户详情
        res[0].userinfo = await getUserInfo(res[0].id);
        return res;
    }
}

//用户注册
let regUser = async (phone) => {
    
    
    //检测用户是不是第一次注册
    let userpic = 'https://profile.csdnimg.cn/1/3/0/3_weixin_43757001';
    // let sql = `insert into user(username,userpic,phone,create_time) values(?,?,?,?)`;
    let sql = `insert into user(username,userpic,phone) values(?,?,?)`;
    // let sqlArr = [phone, userpic, phone, (new Date().valueOf())];
    let sqlArr = [phone, userpic, phone];
    let res = await dbConfig.SySqlConnect(sql, sqlArr);
    if (res.affectedRows == 1) {
    
    
        //执行成功获取用户信息
        //获取用户信息的方法
        let user = await getUser(phone);
        //创建用户副表
        let userinfo = await createUserInfo(user[0].id);
        if (userinfo.affectedRows == 1) {
    
    
            return user;
        } else {
    
    
            return false;
        }
    } else {
    
    
        return false;
    }
}

//获取用户信息
let getUser = (username) => {
    
    
    let sql = `select * from user where id=? or phone=? or username=?`;
    let sqlArr = [username, username, username];
    return dbConfig.SySqlConnect(sql, sqlArr);
}

//创建用户副表
let createUserInfo = (user_id) => {
    
    
    let sql = `insert into userinfo(user_id,age,sex,job) values(?,?,?,?)`;
    let sqlArr = [user_id, 18, 2, '未设置'];
    return dbConfig.SySqlConnect(sql, sqlArr);
}

//获取注册的用户详情
let getUserInfo = (user_id) => {
    
    
    let sql = `select age,sex,job,path,birthday from userinfo where user_id=?`;
    let sqlArr = [user_id];
    return dbConfig.SySqlConnect(sql, sqlArr);
}

//模拟验证码发送接口
sendCode = (req, res) => {
    
    
    let phone = req.query.phone;
    if (sendCodeP(phone)) {
    
    
        res.send({
    
    
            'code': 400,
            'msg': '已经发送过验证码,稍后再发'
        })
    }
    let code = rand(1000, 9999);
    validatePhoneCode.push({
    
    
        'phone': phone,
        'code': code
    })
    console.log(validatePhoneCode);
    res.send({
    
    
        'code': 200,
        'msg': '发送成功'
    })
    console.log(code)
}

//验证码登录接口
codePhoneLogin = async (req, res) => {
    
    
    let {
    
     phone, code } = req.query;
    //该手机号是否发过发过验证码
    if (sendCodeP(phone)) {
    
    
        //验证码和手机号是否匹配
        let status = findCodeAndPhone(phone, code);
        if (status == 'login') {
    
    
            //登录成功
            //登录成功之后的操作
            let user = await phoneLoginBind(phone)
            res.send({
    
    
                'code': 200,
                'msg': '登录成功',
                'data': user[0]
            })
        } else if (status == 'error') {
    
    
            res.send({
    
    
                'code': 200,
                'msg': '登录失败'
            })
        }
    } else {
    
    
        res.send({
    
    
            'code': 400,
            'msg': '未发送验证码'
        })
    }

}

module.exports = {
    
    
    sendCode,
    sendCoreCode,
    codePhoneLogin
}
2、编辑util目录下的dbconfig.js文件。
const mysql = require('mysql');
const {
    
     connect } = require('../routes');
module.exports = {
    
    
    //数据库配置
    config: {
    
    
        host: 'localhost',
        port: '3306',
        user: 'root',
        password: 'Luo1998==',
        database: 'exapp',
    },
    //连接数据库,使用MySQL的连接池连接方式
    //连接池对象
    sqlConnect: function (sql, sqlArr, callBack) {
    
    
        var pool = mysql.createPool(this.config)
        pool.getConnection((err, conn) => {
    
    
            console.log('12345')
            if (err) {
    
    
                console.log('连接失败');
                return;
            }
            //事件驱动回调
            conn.query(sql, sqlArr, callBack);
            //释放连接
            conn.release();
        })
    },

    //promise回调
    SySqlConnect: function (sySql, sqlArr) {
    
    
        return new Promise((resolve, reject) => {
    
    
            var pool = mysql.createPool(this.config);
            pool.getConnection((err, conn) => {
    
    
                if (err) {
    
    
                    reject(err);
                } else {
    
    
                    //事件驱动回调
                    conn.query(sySql, sqlArr, (err, data) => {
    
    
                        if (err) {
    
    
                            reject(err);
                        } else {
    
    
                            resolve(data);
                        }
                    });
                    //释放连接
                    conn.release();
                }
            })
        }).catch((err) => {
    
    
            console.log(err);
        })
    }
}
3、创建数据表userinfo保存用户信息。

在这里插入图片描述

4、打开Postman验证接口,验证结果如下,成功!sendCode接口获取验证码,codePhoneLogin接口使用验证码登录成功。数据库中user表和userinfo表都有了用户信息。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43757001/article/details/109273676