node.js + express框架 + mongodb数据库 来创建登录注册(一)
写在前面:本人是刚学一个月后端的菜鸟,自己按照网上教程和视频摸索着写一套可以给自己前端使用的后台,因为网上的信息非常琐碎并且很多模糊不清,所以这里做一个笔记,作为以后可以来查看的说明书,
本文的想法为:
1.写一个详细说明书,从全新的电脑上如何从0开始写程序,所以按照步骤一步步的做即可。
2.把目前写该程序踩的各种各样的小坑,和对整个程序的理解方式记录下来。
由于本人资质浅薄,所以内部有各种错误还望各位大佬指点一番,以后也会更新更好的办法,来实现现在想不到或者做不到的事,如果按照做法发现错误也欢迎在评论区指出,有同好的学习者也可以加我qq:940094707,来互相指点和请教问题,请注明是从博客园来的即可,再次感谢看这篇文章
一. 安装阶段
安装node.js,express框架
node.js从官方网站下载
npm install express
安装mongodb数据库 + Robo 3T数据库查看器 + Postman接口端测试工具
mongodb下载地址:https://www.mongodb.com/download-center/community 快速下载办法:选择好Package,Version和OS后,复制Download按钮下方的下载链接到迅雷/其他第三方下载软件中下载 服务器下载zip格式,下载好后直接解压到硬盘,注意路径不要带有中文 Robo 3T下载地址:https://robomongo.org/ 注意下载的版号,如果版号太低会无法连接数据库 Postman下载地址:https://www.getpostman.com/downloads/ 下载后需要注册,主要使用方式为测试接口,注意get请求和post请求参数写的位置不同, get请求参数写在Params -- Query Params中 post请求参数写在Body -- x-www-form-urlencoded中
数据库解压好后在和bin同级目录中新增文件夹data,内部新建db,log两个文件夹
二. 数据库启动阶段
按照以下顺序来启动
mongodb数据库启动(必须在所有程序之前启动):
在bin中输入 mongodb --dbpath ..\data\db 出现下面这句话时说明启动成功 NETWORK [listener] connection accepted from 127.0.0.1:54460 #1 (1 connection now open)
mongodb数据库操作(可使用Roto 3T代替)
在bin中输入 mongo.exe
三. 创建服务器项目阶段
使用node.js环境 + Express框架来创建服务器项目
express -e 项目名称
项目创建成功后,手动安装插件
npm install
安装以下第三方程序
nodemon:服务器热启动 express-session:服务器缓存 body-parser:post参数接收 mongoose:操作mongodb服务器 nodemailer:控制邮件的发送 nodemon: npm install -g nodemon express-session: npm install express-session body-parser: npm install body-parser mongoose: npm install mongoose nodemailer: npm install nodemailer
创建成以下目录
bin(略) controllers(处理不同路由对应函数的模块) usersAdmin.js(管理员申请时对应的处理函数) usersGet.js(get请求申请时对应的处理函数) usersPost.js(post请求时对应的处理函数) models(操作数据库的模块) users,js(连接数据库,并关于对数据库的使用的函数) node_modules(模块) public(静态资源存放模块) routes(路由筛选模块,用于确认调用什么函数,函数来自于controllers文件夹) usersAdmin.js(管理员路由筛选) usersGet.js(get请求路由筛选) usersPost.js(post请求路由筛选) untils(第三方模块配置处,比如nodemailer) config.js(由第三方模块参与的函数) views(中间件模块) app.js(总输出闸门) package.jsom(所有模块配置清单) package-lock.json(模块详细单位清单)
启动服务器
热启动 nodemon 常规启动 npm start 注: 1.服务器默认地址为http://localhost:3000/ 2.同一台电脑不能启动两个相同地址的服务器 3.常规启动下,如果服务器内部发生了代码变动并保存,需要ctrl+c退出重启,热启动下会自动刷新,有时会卡住,需要ctrl+c 4.只要代码变动,服务器就会重启,内部缓存会自动清空
四. 服务器和数据库连接
数据流动方式:models ==》app.js,在models中配置数据库,并且在app.js中调用该函数
models --- users.js中
var mongoose = require('mongoose');
var Mongoose = {
//url地址
url:'mongodb://localhost:27017/myserver',
connect(){
//配置connect,它也是连接数据库的函数
mongoose.connect(this.url,{ useNewUrlParser: true , useUnifiedTopology: true },err=>{
if(err){
console.log(err);
console.log('连接数据库失败')
}else{
console.log('连接数据库成功')
}
})
}
}
module.exports = { Mongoose } //向app.js中输出
app.js中
var { Mongoose } = require('./models/users.js');
Mongoose.connect();
注意事项:
1.Mongoose的url前缀,不能写成http://localhost:27017/
必须写成mongodb://localhost:27017/
必须写成mongodb://localhost:27017/
必须写成mongodb://localhost:27017/
后面的myserver代表你需要连该数据库的那个库名,在连接前需要创建该库
2.在connect中必须追加
{ useNewUrlParser: true , useUnifiedTopology: true }
在this.url和回调函数中间,不添加会报错(但是能正常连接)
五. 第三方程序配置
express-session(服务器session缓存)
app.js中引用
var session = require('express-session');
app.use(session({
secret: '$#@#%#',
name: 'sessionId',
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 1000 * 60 * 60 //保存时间。该时间为1小时
}
}))
调用方式
req为路由函数的第一参数
存储: req.session.A = A
提取: var B = req.session.A
注意:session的缓存是会在重启服务器时候消失
现未知能否创建不同缓存时间的session单项目,待更新
body-parser(post参数接收)
app.js中调用
var bodyParser = require('body-parser')
//创建单项
var jsonParser = bodyParser.json()
var urlencodedParser = bodyParser.urlencoded({ extended: false })
//app.js中路由前缀区
app.use('/admin', jsonParser, urlencodedParser, adminRouter);
app.use('/get/myserver', jsonParser, urlencodedParser, usersRouterGet);
app.use('/post/myserver', jsonParser, urlencodedParser, usersRouterPost);
原理是能让该路由能够处理json,urlencoded的数据格式
调用方式
在路由的处理函数,必须是post请求
var { A,B.C } = req.body
得到参数名为A,B,C的数据
如果是get请求
var A = req.query.A
nodemailer(控制邮件的发送)
在untils --- config.js中
const nodemailer = require('nodemailer');
let transporter = nodemailer.createTransport({
host: 'smtp.qq.com',
port: 587,
auth: {
user: '1111111111@qq.com',
pass: 'aaaaaaaaaaa'
}
});
module.exports = { transporter } //向外暴露
注意:
host的格式必须是:smtp.什么邮箱.com,
port和pass的来源来自该邮箱的smtp码和接口,具体得到方式搜索对应邮箱的获取方式
使用方式:
在路由对应函数文件controllers中引用
var { transporter } = require('../untils/config.js') //邮箱
let mailOptions = {
from: '"myserver" <1111111111@qq.com>', //发送者邮箱
to: '222222222@qq.com' //收件者邮箱
subject: '标题', //邮件标题
text: '内容内容内容内容内容内容' //邮件内容
};
let info = await transporter.sendMail(mailOptions)
判断info,为真代表发送成功,为假代表发送失败
注意:
from中必须严格按照 '发送人名称' <发送人邮箱>的形式,且发送人邮箱必须和config.js中的user相同
六. 请求分析
登录注册模块,需要以下的申请
1.登录模块 /post/myserver/login ,post请求,参数为username(用户名)和password(密码) 2.注册模块 /post/myserver/errol ,post请求,参数为verification(注册码),username(用户名),password(密码),age(年龄) 3.邮箱验证码申请 /get/myserver/userEmail?:email,get请求,参数为email(邮箱) 4.退出登录 /get/myserver/loginOff 无参数 5.管理员对账号的状态进行改变/admin/update?:username&:status get请求,参数为username(用户名)和status(状态)
其中对数据库的操作函数为
1.保存注册信息到数据库 user,输入参数为对象,
{ username:'', password:'', age:000, loginAt:new Date(), status:0 }
2.从数据库中查询是否有相同邮箱(查重),输入参数为邮箱email
3.登录组件,通过输入的参数来查找是否存在对应数据,从而判断是否成功登录
4.对数据库中储存的账户的状态进行修改(仅限管理员操作,但并不在这里进行判断)
数据流动
app.js中的(app.use('/get/myserver')) ===> routes中的usersGet.js中的router.get('/userEmail?:email',myserverGet.email) ===> controllers 中的usersGet.js内部配置对应函数
即:路由前缀 ==》 路由分支,引用对应的函数 ==》 不同函数提供
而controllers 中是引用各种第三方函数,数据库函数之处,这样可以确保数据流动的单向性,确保不同函数做不同对应的事

浙公网安备 33010602011771号