学习链接: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表都有了用户信息。