• 你想了解的node.js与数据库的交互效果


    今天我们来讲一些node.js相关的简单的登陆注册所用到的数据库为mongodb

    作为你操作的基础当然是要有html页面了,

      1、首先我们来写一下html页面

      a.共同的页面content.html(在js中我们是把html页面放入js中然后通过js的调用来实现公共的头/尾部)

      此处用了bootstrap,读者如果有兴趣的话也可以了解一下,当年的英雄

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    <body>
    <nav class="navbar navbar-default">
    <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
    <span class="sr-only">Toggle navigation</span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    </button>
    <a class="navbar-brand" href="#">后台管理系统</a>
    </div>
     
    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
    <ul class="nav navbar-nav">
    <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
    <li><a href="#">登录列表</a></li>
    <li><a href="#">注册列表</a></li>
    </ul>
    <form class="navbar-form navbar-left">
    <div class="form-group">
    <input type="text" class="form-control" placeholder="请输入用户名">
    </div>
    <button type="submit" class="btn btn-default">查询</button>
    </form>
    <!-- 判断数据库中返回值是否存在username -->
    {% if !username %}
    <ul class="nav navbar-nav navbar-right">
    <li class="{{isLogin}}"><a href="/login">登录</a></li>
    <li class="{{isReg}}"><a href="/regist">注册</a></li>
    </ul>
    {% else %}
    <ul class="nav navbar-nav navbar-right">
    <!-- {{username}}中的username为登录成功后从数据库中返回的用户名 -->
    <li><a href="/#">用户名:{{username}}</a></li>
    <li><a href="/logout">退出</a></li>
    </ul>
    {% endif %}
    </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
    </nav>
    </body>
    </html>
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    {% block content %}
    {% endblock %}
    <!-- content块用来存放登录或者注册部分 -->
    {% block registjs %}
    {% endblock %}
    <!-- registjs块用来存放注册js部分 -->
    {% block loginjs %}
    {% endblock %}
    <!-- loginjs块用来存放登录JS部分 -->

    b.书写首页home.html

    {% extends 'content.html' %}
    <!-- 理解为引入content.html -->
    {% block content %}
    <h1>首页</h1>
    {% endblock %}

    c.书写login.html

    {% extends './content.html' %}
    {% block content %}
    <div>
        <div class="form-group">
          <label for="exampleInputEmail1">Email address</label>
          <input type="text" class="form-control" id="username" placeholder="name">
        </div>
        <div class="form-group">
          <label for="exampleInputPassword1">Password</label>
          <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
        </div>
        <button type="submit" class="btn btn-default" id="login">登录</button>
        <button type="submit" class="btn btn-default" id="cancel">取消</button>    
    </div>
    {% endblock %}
    {% block loginjs %}
    <script src="/static/login.js"></script>
    {% endblock %}

    d.书写regist.html

    {% extends './content.html' %}
    {% block content %}
    <div>
        <div class="form-group">
          <label for="exampleInputEmail1">用户名</label>
          <input type="text" class="form-control" id="exampleInputname" placeholder="name">
        </div>
        <div class="form-group">
          <label for="exampleInputPassword1">Password</label>
          <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
        </div>
        <div class="form-group">
            <label for="exampleInputPassword1">Password</label>
            <input type="password" class="form-control" id="rePassword1" placeholder="Password">
          </div>
        <button type="submit" class="btn btn-default" id="confim">注册</button>
        <button type="submit" class="btn btn-default" id="cancel">取消</button>    
    </div>
    {% endblock %}
    
    {% block registjs %}
    <script src="/static/regist.js"></script>
    {% endblock %}

    到现在为止我们的HTML页面写完了吗?其实是没有的因为我们还有js没有书写

    2、书写js代码

      a.书写login.js

    var login=$('#login');
    var username=$("#username")
    var exampleInputPassword1=$("#exampleInputPassword1")
    var cancel=$('#cancel')
    login.on('click',function(){
        var user = username.val()
        var psd= exampleInputPassword1.val();
        console.log(user,psd)
        $.ajax({
            url:'/ajax/ab',
            method:'POST',
            data:{
                usename:user,
                password:psd
            },
            success:function(data){
                console.log(data);
                if(data.status == 0){
                    // 登录成功跳转到根目录(首页)
                    window.location.href='/';
                }else{
                    console.log(data.message)
                }
            }
        })
    })
    cancel.on("click",function(){
        location.href="/"
    })

      b.书写regist.js

      

    var confim=$('#confim');
    var exampleInputname=$("#exampleInputname")
    var exampleInputPassword1=$("#exampleInputPassword1")
    var rePassword1=$("#rePassword1")
    var cancel=$('#cancel')
    confim.on('click',function(){
        var user = exampleInputname.val()
        var psd= exampleInputPassword1.val();
        var repsd = rePassword1.val();
        if(psd !=repsd){
            alert("两次密码验证不一致,请重新输入")
            return;
        }
        $.ajax({
            url:'/ajax/a',
            method:'POST',
            data:{
                usename:user,
                password:psd
            },
            success:function(data){
                if(status==0){
                    //注册成功,跳转到登录页面
                    location.href="/login";
                }else{
                    alert(status.message)
                }
            }
        })
    })
    cancel.on("click",function(){
        console.log("取消")
        location.href="/"
    })

    3.我们在数据库中创建一张表

    const mongoose = require('mongoose');
    //创建表格
    const userSchema = new mongoose.Schema({
        usename: String,
        password:String
    })
    // 创建表名为userpeoson,模型为userSchema的表
    const User=mongoose.model('userpeoson',userSchema)
    module.exports = User;

    4.引入中间文件(server.js)将客户端和数据库连接起来

    const express = require("express")
    const swig = require('swig');
    const mongoose = require('mongoose');
    const htmlrouter= require('./handlerequest/htmlrouter')
    const ajaxrouter= require('./handlerequest/ajaxRouter')
    new Promise((resolve,reject)=>{
        //连接数据库(27017为我们设置的port值如图一)
        mongoose.connect('mongodb://localhost:27017',(error)=>{
            if(error){
                console.log('连接数据库失败');
            }else{
                console.log('连接数据库成功')
                resolve();
            }
        })
    })
    .then(()=>{
        //启动服务器
        const app = express();
        //处理静态的文件(比如js等不会改变的文件)
        app.use('/static',express.static('./public'));
        //处理www文件下变化的页面
        app.set('view engine','html')
        app.set('views','./www');
        app.engine('html',swig.renderFile);
        swig.setDefaults({cache:false});
        //使用中间键htmlrouter处理变化的HTML文件
        app.use('/',htmlrouter)
        //使用中间键ajaxrouter处理变化的ajax文件
        app.use('/ajax',ajaxrouter)   
        app.listen(9000,(error)=>{
            if(error){
                console.log('服务器启动失败');
            }else{
                console.log('服务器启动成功');
                console.log('http://localhost:9000')
            }
        })
    })

    5.编写htmlrouter.js处理变化的HTML文件

    //处理html请求
    const express= require('express');
    const bodyParser = require('body-parser')
    const user = require("../model/database")
    const cookie = require('cookies')
    const router = new express.Router();
    router.get('/',(req,res)=>{
        //判断用户是否登录了
        let cookies = new cookie(req,res)
        let userid = cookies.get('userid');
        if(userid){
            //用户已经登录
            user.findById(userid).then(info=>{
                res.render('home',{
                    isHome:'active',
                    username:info.usename
                })
            })
        }else{
            //用户没有登录
            //根路径解析为home.html
            res.render('home',{
                isHome:'active'
            })
        }
    })
    router.get("/login",(req,res)=>{
        
        res.render('login',{
            isLogin: 'active'
        })
    })
    router.get('/regist',(req,res)=>{
        res.render('regist',{
            isReg: 'active'
        })
    })
    router.get('/logout',(req,res)=>{
    //点击退出时让cookies中的userid变为空
        let cookies = new cookie(req,res);
        cookies.set('userid',null);
        //让页面跳转到首页
        res.redirect('/');
    })
    module.exports = router;

    6.编写ajaxrouter.js处理变化的ajax文件

    //处理ajax请求
    const express = require('express')
    const use = require('../model/database')//?
    const bodypar = require('body-parser')
    const Cookie = require("cookies");
    const router = new express.Router();
    module.exports = router;
    router.use("/a",bodypar());
    router.post('/a',(req,res)=>{
        
        let username=req.body.usename;
        let password = req.body.password;
        console.log(username,password)
        //判断用户名是否存在
    use.findOne({
        usename:username
    })
    .then(
        info=>{
            if(info){
                //如果用户注册了
                res.json({
                    status:1,
                    message:'该用户已经注册'
                })
            }else{
                console.log(username,password)
                let useinfo = new use({
                    usename:username,
                    password:password
                });
                useinfo.save().then(()=>{
                    res.json({
                        status:0,
                        message:'注册成功'
                    })
                })
            }
        }
    )
    })
    router.use("/ab",bodypar());
    router.post('/ab',(req,res)=>{
        
        let username=req.body.usename;
        let password = req.body.password;
        console.log(username,password)
        //判断用户名是否存在
    use.findOne({
        usename:username
    })
    .then(
        info=>{
            if(info){
                //数据库存在用户
                if(info.password == password){
                    //创建cookie
                    let cookies= new Cookie(req,res);
                    cookies.set('userid',info._id);
                    res.json({
                        message:'登录成功',
                        status:0
                    })
                }else{
                    res.json({
                        message:'登录失败,密码错误',
                        status:2
                    })
                }
            }else{
                res.json({
                    message:'该用户不存在',
                    status:1
                })
            }
        }
    )
    })

    7.到现在为止我们基本的基础工作已经完成了,需要的就是开启数据库,运行我们书写的server.js文件了

      a.运行mongod --dbpath D:练习db-projectdb(D:练习db-projectdb为你数据库想要存放的地方)

      注意点:安装mongodb需要运行的地址是

      

      你如果想直接用Windows+r快捷键直接运行的话就需要将这个路径添加到系统的path路径下

      

    运行结果(图一)端口27017

    8.在你的server地址下运行server.js文件(http://localhost:9000是我在server.js中设置的地址,也是你要访问的地址)

    9.运行http://localhost:9000结果如下图.

    恭喜你现在一个简单的node注册登录就完成了

  • 相关阅读:
    Microsoft Security Essentials
    android studio 引用远程仓库下载慢(JCenter下载慢)的办法
    Android studio Unable to start the daemon process
    Android studio 怎么使用已经下载好的Android SDK ?
    解决Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!
    U3d中实现A*寻路,附源文件
    [运维-服务器 – 1A] – nginx.conf(转)
    unity客户端与c++服务器之间的简单通讯_1
    [Java Web – Maven – 1A]maven 3.3.3 for windows 配置(转)
    [Android-2A] -仿IOS微信滑动删除_SwipeListview左滑删除例子
  • 原文地址:https://www.cnblogs.com/tc-jieke/p/9228003.html
Copyright © 2020-2023  润新知