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 中是引用各种第三方函数,数据库函数之处,这样可以确保数据流动的单向性,确保不同函数做不同对应的事

  

posted @ 2020-02-03 18:40  真御剑随风  阅读(188)  评论(0)    收藏  举报