mongodb 安装
参考菜鸟教程:www.runoob.com/mongodb/mon… linux下的安装
sudo apt-get install libcurl4 openssl
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz # 选择合适版本下载
tar -zxvf mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz # 解压
mv mongodb-src-r4.2.8 /usr/local/mongodb4 # 将解压包拷贝到指定目录
可以在mongodb4下创建data和log文件夹,也可以跟着教程选择在/var/lib文件夹下建立
sudo mkdir -p /var/lib/mongo
sudo mkdir -p /var/log/mongodb
sudo chown `whoami` /var/lib/mongo # 设置权限
sudo chown `whoami` /var/log/mongodb # 设置权限
启动mongodb服务
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
再回到bin目录下开启mongodb
$ cd /usr/local/mongodb4/bin
$ ./mongo
mongodb 简介
MongoDB是面向文档的schema无关的数据库,它可以将任意类型的文档数据储存到集合中,非常适合Node.js应用(它所能处理的数据格式和前后端JS脚本中的数据格式非常接近,这避免了需要在“行”和”数据对象“之间的来回转换)
本文使用了Moogoose,用于快速为mongodb建立一个模型对象,可以实现Mongodb数据库的访问和增删改查.
jade
jade是一个流行的Node.js模板引擎,有以下几个特征:
1.使用缩进
默认两个空格,可以将下面的代码解释为<p><span>abc</span></p>
p
span abc
2.使用doctype5自动插入
使用后h5的doctype
3.block关键字
block是一个特殊的关键字,可以使其他的视图文件嵌入到这个位置。
4.属性用括号括起来
a(href=#,another=attribute,dynamic=someVariable) My link
容易嵌入变量
5.通过#{}嵌入变量
p welcome back ,#{user.name}
jade编写主要页面的模板
index.jade
extends layout
block body
if (authenticated)
p Welcome back, #{me.first}
a(href="/logout") Logout
else
p Welcome new visitor
ul
li: a(href="/login") Login
li: a(href="/signup") Signup
signup.jade
extents layout
block body
form(action="/signup",method="POST",enctype='multipart/form-data')
fieldset
legend Sign up
p
label First
input(name="user[first]",type="text")
p
label Last
input(name="user[last]",type="text")
p
label Email
input(name="user[email]",type="text")
p
label Password
input(name="user[password]",type="password")
p
button Submit
p
a(href="/") Go back
login.jade
extend layout
block body
form(action="/login",method="POST",enctype='multipart/form-data')
fieldset
legend Log in
if(signupEmail)
p Congratulations on signing up!Please login below.
p
label Email
li: a(href="/login") Login
li: a(href="/signup") Signup
signup.jade
extents layout
block body
form(action="/signup",method="POST",enctype='multipart/form-data')
fieldset
legend Sign up
p
label First
input(name="user[first]",type="text")
p
label Last
input(name="user[last]",type="text")
p
label Email
input(name="user[email]",type="text")
p
label Password
input(name="user[password]",type="password")
p
button Submit
p
a(href="/") Go back
login.jade
extend layout
block body
form(action="/login",method="POST",enctype='multipart/form-data')
fieldset
legend Log in
if(signupEmail)
p Congratulations on signing up!Please login below.
p
label Email
input(name="user[email]",type="text",value=signupEmail)
p
label Password
input(name="user[password]",type="password")
p
button submit
p
a(href='/') Go back
layout.jade
doctype
html
head
title MongoDB example
body
h1 My first MongoDB app
hr
block body
index.js定义模板渲染引擎,并把jade文件放在默认渲染文件夹/views下
app.set('view engine','jade')
app.set('view options',{layout:false})
/*定义路由 */
app.get('/',function(req,res){
res.render('index')
})
app.get('/login',function(req,res){
res.render('login')
})
app.get('/signup',function(req,res){
res.render('signup')
})
mongodb连接和modeling
/*
* @Author: kkkokra
* @Date: 2021-05-01 08:31:23
* @LastEditTime: 2021-05-02 22:59:41
* @FilePath: /mongodb-exercise/mongo.js
*/
var mongoose = require('mongoose');
//连接到数据库,这个数据库需要是已经建立好的,并且在后台把Mongo服务开启,才可以连接成功
mongoose.connect('mongodb://localhost/myWebsite');
//创建连接对象
var db=mongoose.connection
db.on('error',console.error.bind(console,'connection error:'))
db.once('open', function() {
// we're connected!,连接成功返回正确提示
console.log('we are connected!')
});
//创建文档模板
var userSchema=mongoose.Schema({
firstName:String,
lastName:String,
email:String,
password:String
})
//User为User集合的模型对象
var User=mongoose.model('User',userSchema)
//Event.ensureIndexes(function (err) {
//if (err) return handleError(err);
//});
//确保所有的index已经创建
User.on('index', function (err) {
if (err) console.error(err);
else console.log('ensure index') // error occurred during index creation
})
//暴露模型对象
module.exports = {mongoose,User}
登录
app.get('/login',function(req,res){
res.render('login')
})
app.post('/login',multipartMiddleware,function(req,res){
User.findOne({'email':req.body.user.email,'password':req.body.user.password}, function (err, person) {
if (err) throw err;
if(!person) return res.send('<p>User not found.Go back and try again</p>')
console.log('login : find a person')
req.session.logged_in=person._id.toString()
console.log('1',req.session.logged_in)
res.redirect('/')
})
注册
app.get('/signup',function(req,res){
res.render('signup')
})
app.post('/signup',multipartMiddleware,function(req,res){
console.log(req.body)
var newUser = new User(req.body.user);
newUser.save(function(err){
if(err) throw err
else console.log('save the user information')
})
res.redirect('/login/'+req.body.user.email)
})
app.get('/login/:signupEmail',function(req,res){
res.render('login',{signUpEmail:req.params.signupEmail})
})
自动登录
app.use(function(req,res,next){
console.log('2',req.session.logged_in,typeof(req.session.logged_in))
if(req.session.logged_in){
res.locals.authenticated=true
User.findOne({'_id':req.session.logged_in}, function (err, person) {
if (err) throw err;
if (!person) return console.log('not exist')
res.locals.me=person
console.log('relogin: find a person ')
next()
})
}
else {
res.locals.authenticated=false
next()
}
})
app.set('view engine','jade')
app.set('view options',{layout:false})
/*定义路由 */
app.get('/',function(req,res){
res.render('index')
})
app.get('/login',function(req,res){
res.render('login')
})
app.post('/login',multipartMiddleware,function(req,res){
User.findOne({'email':req.body.user.email,'password':req.body.user.password}, function (err, person) {
if (err) throw err;
if(!person) return res.send('<p>User not found.Go back and try again</p>')
console.log('login : find a person')
req.session.logged_in=person._id.toString()
console.log('1',req.session.logged_in)
res.redirect('/')
})
})
注销
app.get('/logout',function(req,res){
req.session.logged_in=null;
res.redirect('/')
})
以上完成了登录注册的逻辑,代码会上传github.