Nodejs学习日记(十):mongodb和jade

163 阅读4分钟

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.