实战:一、使用mongo做一个注册的小demo
思路:
1、使用mongoose 进行 数据库的链接
2、使用Schema来进行传输字段的定义
3、安装koa-router进行数据处理
4、安装koa-bodyparser 进行post数据交互
5、解决跨域
6、前端传递值
7、在router.pot里面 处理 前端传递过来的值。
一、连接数据库
(1)建立一个项目文件夹: service , npm init
(2)安装 mongoose连接数据库,Mongoose是一个开源的封装好的实现node和MongoDB数据通讯的数据建模库 ,npm i mongoose -S
(3)建立一个database的文件夹,来存放和数据库相关的文件,init.js 代码如下:
const mongoose = require('mongoose'); //引入mongoose插件
const db = "mongodb://localhost/demo1" //建立链接的地址,如果数据库里面没有这个数据表则自动建立
exports.connect = ()=>{ //把connect 这个函数暴露出去,并且在此函数里面做一下操作。
//连接数据库
mongoose.connect(db)
//如果数据库连接失败,自动重新连接,连接3次以上放弃连接,设置变量,来保存连接的次数
let maxConnectTimes = 0
//先确保数据库连接成功,在做其他的事情,这里使用Promise做一个异步操作
return new Promise((resolve,reject)=>{
//增加数据库检听事件
mongoose.connection.on('disconnected',()=>{
if(maxConnectTimes<3){
maxConnectTimes++
mongoose.connect(db)
console.log("******重新连接数据库*****")
}else{
reject()
throw new Error("数据库有问题,请人为修改以后在连接")
}
})
//连接报错以后
mongoose.connection.on('error',err=>{
console.log('***********数据库错误***********')
if(maxConnectTimes<3){
maxConnectTimes++
mongoose.connect(db)
}else{
eject(err)
throw new Error('数据库出现问题,程序无法搞定,请人为修理......')
}
})
//连接打开时
mongoose.connection.once('open',()=>{
console.log("MongoDB success")
resolve()
})
})
}
二、使用Schema进行数据建模
(1)数据库连接成功以后,使用Schema进行数据建模,定义好传输的字段和模型,Schema是一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力。Schema是以key-value形式Json格式的数据。
(2)Schema中的数据类型:
1、String :字符串类型
2、Number :数字类型
3、Date : 日期类型
4、Boolean: 布尔类型
5、Buffer : NodeJS buffer 类型
6、ObjectID : 主键,一种特殊而且非常重要的类型
7、Mixed :混合类型
8、Array :集合类型
(3)Mongoose中的三个概念:
1、schema :用来定义表的模版,实现和MongoDB数据库的映射。用来实现每个字段的类型,长度,映射的字段,不具备表的操作能力。
2、model :具备某张表操作能力的一个集合,是mongoose的核心能力。我们说的模型就是这个Mondel。
3、entity :类似记录,由Model创建的实体,也具有影响数据库的操作能力。
(4)新建一个为schema.js的文件夹。并且执行代码:
const mongoose = require('mongoose') //声明mongoose
const Schema = mongoose.Schema //引入Schema
let ObjectId = Schema.Types.ObjectId //声明Object类型
//创建自己的用户Schema
const userSchema = new Schema({
UserId : ObjectId, //固定写法
username : {unique:true,type:String}, //设置用户名不允许重复,字符串格式
password : String,
createAt:{type:Date,default:Date.now()},
lastLoginAt:{type:Date,default:Date.now()}
})
//发布模型 user为写入数据表的名称,userSchema 为发布模型的标准
mongoose.model('user',userSchema )
(5)载入Schema
1、Schema建立好以后,需要载入它。在init.js里面做事件。然后在index.js里面执行。
2、要载入Schema必须先引入:一个glob和一个resolve
npm install glob --save //安装glob
const glob = require('glob')
const {resolve} = require('path')
3、说明:
glob:node的glob模块允许你使用 * 等符号,来写一个glob规则,像在shell里一样,获取匹配对应规则文件。
resolve: 将一系列路径或路径段解析为绝对路径。
4、了解两个引入的模块用法后,我们就可以一次性引入所有的Schema文件了。
exports.initSchemas = () =>{
//引入Schema的所有文件,根据文件夹的不同自己去调整
glob.sync(resolve(__dirname,'./schema/','**/*.js')).forEach(require)
}
三、插入一条数据进行调试
实际上一开始我们就应该先建立一个 index.js的文件。这个是主要的文件。来启动项目的。
插入数据调试 代码:
const Koa = require('koa')
const app = new Koa()
const mongoose = require('mongoose')
const {connect , initSchemas} = require('./database/init.js')
//立即执行函数,执行连接数据库的函数和载入Schema的函数
;(async () =>{
await connect()
initSchemas()
const User = mongoose.model('user') //user 是发布模型里面使用的表
let oneUser = new user({userName:'jspang13',password:'123456'}) //插入数据
oneUser.save().then(()=>{
console.log('插入成功')
})
let users = await User.findOne({}).exec()
console.log('------------------')
console.log(users)
console.log('------------------')
})()
app.use(async(ctx)=>{
ctx.body = '<h1>hello Koa2</h1>'
})
app.listen(3000,()=>{
console.log('[Server] starting at port 3000')
})
四、使用bcryptjs用户加密处理
1、bcryptjs是一个第三方密码加密库,是对原有bcrypt的优化,优点是不需要安装任何依赖
npm install bcryptjs -S
2、bcryptjs 和 Schema 写在一个文件里面 完整版代码:
const mongoose = require('mongoose') //引入mongoose
const Schema = mongoose.Schema //声明Schema
let ObjectId = Schema.Types.ObjectId //声明Object类型
const bcrypt = require('bcryptjs');
const SALT_WORK_FACTOR = 10
//创建用户的Shema 也就是用来定义 表的模板
const userSchema = new Schema({
UserId : ObjectId,
userName : {unique:true,type:String},
password : String,
// _id:String,
createAt:{type:Date,default:Date.now()},
lastLoginAt:{type:Date,default:Date.now()}
})
// 用pre每次进行保存时都进行加盐加密的操作
userSchema.pre('save',function(next){
let _this = this
bcrypt.genSalt(SALT_WORK_FACTOR,(err,salt)=>{
if(err){
return next(err)
}
//把密码传给hash进行加密。成功以后赋值给password属性
bcrypt.hash(_this.password,salt,(err,hash)=>{
if(err) return next(err)
_this.password = hash
next()
})
})
})
mongoose.model('User',userSchema)
五、安装koa-router 并且使路由模块化
1、安装:npm install koa-router --save
2、新建一个sppApi的文件夹,然后在文件夹里面建立 user.js 代码如下:
const Router = require ('koa-router')
let router = new Router()
router.get('/',async(ctx)=>{
ctx.body="这是用户操作首页"
})
router.get('/register',async(ctx)=>{
ctx.body="用户注册接口"
})
module.exports=router;
3、让路由模块化,在index.js里面写入
(1)引入 koa-router const Router = require('koa-router')
(2)引入我们的user.js模块 let user = require('./appApi/user.js')
(3)装载所有子路由 let router = new Router(); router.use('/user',user.routes())
(4)加载路由中间件 app.use(router.routes()) app.use(router.allowedMethods())
我们就可以在浏览器中实验一下我们的模块化路由是否起作用了。在浏览器中输入,http://localhost:3000/user,已经可以出现我们设定好的页面了。
六、打通前后端的通讯。
(1)安装koa2-cors中间件 解决前端跨域问题。
(2)安装koa-bodyparser中间件 获取post提交的数据。
(3)数据处理,返回。
操作:index.js 服务端 文件中 优先 引入 koa2-cors 和 koa-bodyparser 代码如下:
//解决跨域
const cors = require('koa2-cors')
app.use(cors());
//链接数据库,前台和后台的通讯 ,接收post数据
const bodyParser = require('koa-bodyparser')
app.use(bodyParser());
数据处理:(在koa-router的页面使用,或者直接使用,现在在koa-router文件夹下面使用)
const Router = require('koa-router')
const router = new Router()
const mongoose = require('mongoose') router.get('/',async(ctx)=>{
ctx.body = "用户操作首页"
}) router.post('/register',async(ctx)=>{
console.log(ctx.request.body) //取得Model
const User = mongoose.model('User');
//把从前端接收的POST数据封装成一个新的user对象
let newUser = new User(ctx.request.body) //用mongoose的save方法直接储存。然后判断是否成功返回相应的结果。
await newUser.save().then(()=>{
ctx.body = {
code : 200,
message:'注册成功'
}
}).catch((error)=>{
ctx.body = {
code:500,
message:error
}
})
}) module.exports = router
(4)前端业务逻辑代码
axios({
url: url.registerUser,
method: 'post',
data:{
userName:this.username,
password:this.password ,
}
})
.then(response => {
console.log(response)
if(response.data.code==200){
Toast.success('注册成功');
}else{
Toast.fail('注册失败');
}
})
.catch((error) => {
console.log(error)
})
实战:一、使用mongo做一个注册的小demo的更多相关文章
- 今天来做一个PHP电影小爬虫。
今天来做一个PHP电影小爬虫.我们来利用simple_html_dom的采集数据实例,这是一个PHP的库,上手很容易.simple_html_dom 可以很好的帮助我们利用php解析html文档.通过 ...
- 跟我一起做一个vue的小项目(二)
这个vue项目是紧跟着之前的项目跟我一起做一个vue的小项目(一)来的. 我继续后面的开发(写的比较粗糙,边学边记录) 下图是header头部的样式 header组件内容如下 //header.vue ...
- 跟我一起做一个vue的小项目(八)
接下来我们进行的是城市选择页面的路由配置 添加city.vue,使其点击城市,然后跳转到city页面 //router.js import Vue from 'vue' import Router f ...
- 用Nodejs做一个简单的小爬虫
Nodejs将JavaScript语言带到了服务器端,作为js主力用户的前端们,因此获得了服务器端的开发能力,但除了用express搭建一个博客外,还有什么好玩的项目可以做呢?不如就做一个网络爬虫吧. ...
- 跟我一起做一个vue的小项目(七)
先看下我们所做项目的效果 这些数据都是我们在data中定义的,不是从后端数据中请求的.那么 接下来我们使用axios渲染数据 npm install axios --save 每个组件里面的数据都不相 ...
- react实战 : 用矩阵思想做一个自适应布局容器组件
需求是这样的. 有一个需要显示若干方块型元素的小区域 数量比较少的时候显示一排 数量比较多的时候显示两排 用 grid 不好,因为当数量为奇数的时候需要两排里面的元素都乖乖的居中显示. 用 flex ...
- MyEclipse做一个注册页面,需要注意的地方。
- 做一个开源的小程序登录模块组件(token)
先了解下SSO 对于单点登陆浅显一点的说就是两种,一种web端的基于Cookie.另一种是跨端的基于Token,一般想要做的都优先做Token吧,个人建议,因为后期扩展也方便哦. 小程序也是呢,做成t ...
- Python中如何开发一个注册接口小实例
import flask from flask import request #想获取到请求参数的话,就得用这个 server = flask.Flask(__name__) #吧这个python文件 ...
随机推荐
- EularProject 36:2进制和10进制回文数
华电北风吹 天津大学认知计算与应用重点实验室 完毕日期:2015/7/29 Double-base palindromes Problem 36 The decimal number, 585 = 1 ...
- UVAlive 6560 - The Urge to Merge(状压dp)
LA 6560 - The Urge to Merge option=com_onlinejudge&Itemid=8&page=show_problem&problem=45 ...
- 使用美橙主机建站(jsp+mysql+tomcat建站)
1.注冊美橙互联账号:http://www.cndns.com/ 2.选择橙云主机: 3.选择你须要的主机类型. 3.能够随时与客服进行沟通.购买完毕后登陆 管理中心 4.点击左边 主机类管理--&g ...
- Codeforces Beta Round #95 (Div. 2) D. Subway 边双联通+spfa
D. Subway A subway scheme, classic for all Berland cities is represented by a set of n stations co ...
- luogu3111 [USACO14DEC]牛慢跑Cow Jog_Sliver
题目大意 有N (1 <= N <= 100,000)头奶牛在一个单人的超长跑道上慢跑,每头牛的起点位置都不同.由于是单人跑道,所有他们之间不能相互超越.当一头速度快的奶牛追上另外一头奶牛 ...
- Linux内核OOM机制的详细分析【转】
本文转载自:http://blog.csdn.net/liukuan73/article/details/43238623 Linux内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没 ...
- 搜索分析(DFS、BFS、递归、记忆化搜索)
搜索分析(DFS.BFS.递归.记忆化搜索) 1.线性查找 在数组a[]={0,1,2,3,4,5,6,7,8,9,10}中查找1这个元素. (1)普通搜索方法,一个循环从0到10搜索,这里略. (2 ...
- 深度学习利器:TensorFlow在智能终端中的应用——智能边缘计算,云端生成模型给移动端下载,然后用该模型进行预测
前言 深度学习在图像处理.语音识别.自然语言处理领域的应用取得了巨大成功,但是它通常在功能强大的服务器端进行运算.如果智能手机通过网络远程连接服务器,也可以利用深度学习技术,但这样可能会很慢,而且只有 ...
- 神经网络中的激活函数——加入一些非线性的激活函数,整个网络中就引入了非线性部分,sigmoid 和 tanh作为激活函数的话,一定要注意一定要对 input 进行归一话,但是 ReLU 并不需要输入归一化
1 什么是激活函数? 激活函数,并不是去激活什么,而是指如何把“激活的神经元的特征”通过函数把特征保留并映射出来(保留特征,去除一些数据中是的冗余),这是神经网络能解决非线性问题关键. 目前知道的激活 ...
- NOIP2012 D2 T2 借教室 线段树 OR 二分法
题目描述: 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...