node.js+express+mongoose实现用户增删查改案例

node.js+express+mongodb对用户进行增删查改

一、用到的相关技术

  1. 使用 Node.js 的 express 框架搭建web服务
  2. 使用 express 中间件 body-parse 解析表单 post 请求体
  3. 使用 art-template 模板引擎渲染页面
  4. 使用第三方包 mongoose 来操作 MongoDB 数据库

二、在命令行用 npm 执行相关的命令

  1. 初始化项目,在命令行执行 npm init 然后一路回车就行了(或者直接 npm init -y)生成 package.json 文件,它相当于是你项目的说明书
npm init
  1. 安装需要用到的各种包
# Express 框架
npm install express

# 模板引擎(express-art-template 是模板引擎与 express 的关联包)
npm install art-template express-art-template

# express 中间件 body-parser
npm install body-parser

# mongoose
npm install mongoose

三、项目结构说明

四、路由设计

请求方法 请求路径 get 参数 post 参数 备注
GET /user 渲染首页
GET /add 渲染添加用户页面
POST /add name、age、gender、job、hobbies 处理添加用户请求
GET /edit id 渲染编辑页面
POST /edit id、name、age、gender、job、hobbies 处理编辑请求
GET /delete id 处理删除请求

五、编写代码

  1. 入口模块: app.js

    /**
     * app.js 服务入口模块
     * 1. 创建服务
     * 2. 做服务相关的配置
     *    2.1 模板引擎
     *    2.2 body-parser 解析表单 post 请求体
     *    2.3 提供相关的静态资源服务(开放public目录)
     * 3. 挂载路由
     * 4. 监听端口 开启服务
     * */
    
    var express = require('express')
    var router = require('./router.js')
    var bodyParser = require('body-parser')
    
    //创建你的服务器应用程序
    var app = express()
    
    //指定 .html 后缀的文件使用的解析引擎
    app.engine('html',require('express-art-template'))
    
    //开发静态资源
    app.use('/public/',express.static('./public/'))
    app.use('/node_modules/',express.static('./node_modules/'))
    
    // 配置 body-parser 中间件(插件,专门用来解析表单 POST 请求体)
    // parse application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: false }))
    // parse application/json
    app.use(bodyParser.json())
    
    //把路由挂载到 app 服务中
    app.use(router)
    
    //开启服务
    app.listen(3000,function(){
        console.log('server is running ...')
    })
    
    
  2. 路由模块: router.js
    /**
     *
     * router.js 路由模块
     * 根据不同的请求方法 + 请求路径 设置具体的请求处理函数
     *
     * */
    
    var express = require('express')
    var User = require('./user.js')
    
    //1. 创建一个路由
    var router = express.Router()
    
    //2. 把路由都挂载到 router 路由容器中
    
    // =============渲染用户列表页面=============
    router.get('/users',function(req,res){
        User.find(function(err,users){
            if(err){
                return res.status(500).send('Server err')
            }
            res.render('index.html',{users:users})
        })
    })
    
    // =============渲染添加用户信息页面===========
    router.get('/add',function(req,res){
        res.render('add.html')
    })
    
    // ==============处理添加用户==================
    router.post('/add',function(req,res){
        //1. 获取表单数据 req.body
        //2. 处理:将数据保存到 db.json 文件中用以持久化
            new User(req.body).save(function(err){
            if(err){
                return res.status(500).send('server err')
            }
            //3. 重定向到首页
            res.redirect('/users')
        })
    })
    
    // =================渲染编辑用户信息页面============
    router.get('/edit',function(req,res){
        //1. 在客户端的列表中处理链接问题(需要有 id 参数)
        //获取要编辑的学生 通过id
        User.findById(req.query.id.replace(/"/g,''),function(err,user){
            if(err){
                return res.status(500).send('Server error')
            }
            res.render('edit.html',{
                user:user
            })
        })
    })
    
    // ==================处理编辑用户信息================
    router.post('/edit',function(req,res){
        //1. 获取表单数据 req.body
        //2. 通过 id 更新 User.findByIdAndUpdate()
        //3. 重定向到首页
        User.findByIdAndUpdate(req.body.id.replace(/"/g,''),req.body,function(err){
            if(err){
                return res.status(500).send('server error')
            }
            res.redirect('/users')
        })
    })
    
    // ==================删除用户====================
    router.get('/delete',function(req,res){
        // 通过 id 查找到对应用户进行删除 User.findByIdAndDelete()
        User.findByIdAndRemove(req.query.id.replace(/"/g,''),function(err){
            if(err){
                return res.status(500).send('server error')
            }
    
        })
        res.redirect('/users')
    
    })
    
    // 把路由导出
    module.exports = router
  3. 创建数据库 model 模块: user.js
    var mongoose = require('mongoose')
    
    //连接数据库 数据库名(usersdb) 没有会自动创建
    mongoose.connect('mongodb://localhost/usersdb')
    
    //定义数据库表结构 schema
    var Schema = mongoose.Schema
    
    //设计表结构
    var userSchema = new Schema({
        name:{
            type:String,
            require:true
        },
        gender:{
            type:Number,
            enum:[0,1],
            default: 0
        },
        age:{
            type:Number
        },
        job:{
            type:String
        },
        hobbies:{
            type:String
        }
    })
    
    //将文档结构发布为模型并导出
    module.exports = mongoose.model('User',userSchema)
    1. 视图模块

      4.1 index.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>index</title>
          <link rel="stylesheet" href="/public/css/css.css">
          <link rel="stylesheet" href="/public/css/index.css">
      </head>
      <body>
          <header>
              <div class="left">? 用户管理系统</div>
              <div class="right">? 欢迎登陆 admin | 退出</div>
          </header>
          <div class="slide">
              <ul>
                  <li>用户信息</li>
              </ul>
          </div>
          <div class="add">
              <a href="/add">添加用户</a>
          </div>
          <div class="content">
              <table cellspacing="0">
                  <thead>
                      <tr>
                          <td>姓名</td>
                          <td>性别</td>
                          <td>年龄</td>
                          <td>爱好</td>
                          <td>职位</td>
                          <td>操作</td>
                      </tr>
                  </thead>
                  <tbody>
                  {{ each users }}
                      <tr>
                          <td>{{ $value.name }}</td>
                          {{if $value.gender==0 }}
                          <td>男</td>
                          {{ else }}
                          <td>女</td>
                          {{ /if }}
                          <td>{{ $value.age }}</td>
                          <td>{{ $value.hobbies }}</td>
                          <td>{{ $value.job }}</td>
                          <td>
                              <!-- 注意这里 id={{  }} 的=(这个等号)前后不能打空格 不能打成 id = {{  }}
                                  因为打了空格就相当于加了字符串空格,获取的id会有误 -->
                              <a href="/edit?id={{ $value._id }}">编辑</a>
                              <a href="/delete?id={{ $value._id }}">删除</a>
                          </td>
                      </tr>
                  {{ /each }}
                  </tbody>
              </table>
          </div>
      </body>
      </html>

      4.2 add.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>index</title>
          <link rel="stylesheet" href="/public/css/css.css">
          <link rel="stylesheet" href="/public/css/form.css">
      </head>
      <body>
      <header>
          <div class="left">? 用户管理系统</div>
          <div class="right">? 欢迎登陆 admin | 退出</div>
      </header>
          <div class="slide">
              <ul>
                  <li>用户信息</li>
              </ul>
          </div>
          <div class="content">
              <div class="box">
                  <div class="top">添加信息</div>
              <form action="/add" method="post">
                  <table>
                      <tr>
                          <td>姓名:</td>
                          <td><input type="text" name="name" class="text" placeholder="请输入用户名"></td>
                      </tr>
                      <tr>
                          <td>性别:</td>
                          <td>
                              男:<input type="radio" name="gender" value="0">
                              女:<input type="radio" name="gender" value="1">
                          </td>
                      </tr>
                      <tr>
                          <td>年龄:</td>
                          <td><input type="number" name="age" class="text"></td>
                      </tr>
                      <tr>
                          <td>爱好:</td>
                          <td><input type="text" name="hobbies" class="text"></td>
                      </tr>
                      <tr>
                          <td>职位:</td>
                          <td><input type="text" name="job" class="text"></td>
                      </tr>
                      <tr>
                          <td colspan="2">
                              <input type="submit" value="提交" class="button">
                              <input type="reset" value="重置" class="button">
                          </td>
                      </tr>
                  </table>
              </form>
              </div>
          </div>
      </body>
      </html>

      4.3 edit.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>index</title>
          <link rel="stylesheet" href="/public/css/css.css">
          <link rel="stylesheet" href="/public/css/form.css">
      </head>
      <body>
      <header>
          <div class="left">? 用户管理系统</div>
          <div class="right">? 欢迎登陆 admin | 退出</div>
      </header>
      <div class="slide">
          <ul>
              <li>用户信息</li>
          </ul>
      </div>
      <div class="content">
          <div class="box">
              <div class="top">添加信息</div>
              <form action="/edit" method="post">
                  <!--
                  用来放一些不希望被用户看见,但是需要被提交到服务端的数据
                 -->
                  <input type="hidden" name="id" value="{{ user.id }}">
                  <table>
                      <tr>
                          <td>姓名:</td>
                          <td><input type="text" class="text" name="name" value="{{ user.name }}"></td>
                      </tr>
                      <tr>
                          <td>性别:</td>
                          <td>
                              {{ if user.gender == 0 }}
                              男:<input type="radio" name="gender" value="0" checked>
                              女:<input type="radio" name="gender" value="1">
                              {{ else }}
                              男:<input type="radio" name="gender" value="0" >
                              女:<input type="radio" name="gender" value="1" checked>
                              {{ /if }}
                          </td>
                      </tr>
                      <tr>
                          <td>年龄:</td>
                          <td><input type="number" class="text" name="age" value="{{ user.age }}"></td>
                      </tr>
                      <tr>
                          <td>爱好:</td>
                          <td><input type="text" class="text" name="hobbies" value="{{ user.hobbies }}"></td>
                      </tr>
                      <tr>
                          <td>职位:</td>
                          <td><input type="text" class="text" name="job" value="{{ user.job }}"></td>
                      </tr>
                      <tr>
                          <td colspan="2">
                              <input type="submit" value="提交" class="button">
                              <input type="reset" value="重置" class="button">
                          </td>
                      </tr>
                  </table>
              </form>
          </div>
      </div>
      </body>
      </html>

六、测试

  1. 连接数据库

    mongod
  2. 开启服务
    nodemon app.js
  3. 运行结果

项目下载地址:https://github.com/zyxWebGitHub/Node.git

原文地址:https://www.cnblogs.com/zyxnb/p/10808221.html

时间: 2024-08-03 19:19:30

node.js+express+mongoose实现用户增删查改案例的相关文章

[node.js]express+mongoose+mongodb的开发笔记

时间过得很快,6月和7月忙的不可开交,糟心的事儿也是不少,杭州大连来回飞,也是呵呵. 希望下个阶段能沉浸下来,接着学自己想学的.记一下上几周用了几天时间写的课设.因为课设的缘故,所以在短时间里了解下express+mongodb的组合,给APP端搭了个简易的服务器,也开了后台网站的web服务.简单总结一下开发过程中遇到的坑. 一.关于express了解node.js有半年多,第一次用node.js的框架来写server,了解不是很深,简单看了一下文档之后就可以上手了,开发入门难度低.1.运行ex

基于 Node.js + Express + mongoDB + Bootstrap 搭建的电影网站

电影网站 ?? GitHub: https://github.com/bxm0927/movie-website 此项目是基于 Node.js + Express + mongoDB + Bootstrap 搭建的电影网站. 主要功能模块: 一期:前台电影展示页.电影详情页.后台电影管理中心(电影录入.电影修改) 二期:用户登录注册注销功能.用户识别和持久化.后台用户管理中心(用户录入.用户修改).电影评论 <!-- more --> 图片预览 技术栈 [前端] HTML/CSS/JS:亘古不

Node.js Express+Mongodb 项目实战

Node.js Express+Mongodb 项目实战 这是一个简单的商品管理系统的小项目,包含的功能还算挺全的,项目涵盖了登录.注册,图片上传以及对商品进行增.删.查.改等操作,对于新手来说是个很不错的练手项目,分享给大家. GitHub源码:https://github.com/oceanMin/cms 项目前准备 安装node.js 安装express 安装mongoDB 章节目录 快速开始 快速开始 模块 express商品管理系统介绍 框架搭建.ejs .express.static

Node.js+Express+MongoDB数据库实现网页注册登入功能

通过 Node.js + Express + MongoDB 实现网页注册账号 和 登入账号的功能 项目准备: 1: 事先准备好项目的页面 (首页页面 index.html)(登入页面 login.html) (注册页面 register.html) 2:    安装好 Node.js 需要使用的第三方模板 3:  设计路径设计 4:  理清功能需求 5:  创建 app.js  router.js   mgdb.js 三个 js 文件  和 public 和 views 文件夹 作用: app

Node.js Express 框架学习

转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说明.为了学习备份,所以拷贝过来. Express框架 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 概述 运行原理 底层:http模块 对http模块的再包装 什么是中间件 use方法 Express的方法 all方法和HTTP动词方法 set方法 response

Node.js + Express + Mongodb 开发搭建个人网站(二)

二.路由 1.打开 routes/index.js ,这个意思就是  捕获到访问主页的get请求: 并通过 app.js 分配到对应的路由里: 看到这里,打开 http://127.0.0.1:3000/users/  来感受一个路由的意思: routes/index.js 文件: 如果我们请求是get,路径是 '/' 那么就是渲染index.ejs这个视图,可以省略后缀名 .ejs: 这个的意思是将数据传到index.ejs中 并输出到页面上. 2.视图 views/index.ejs 可以看

Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次更新已经比较久了^_^! formidable简介 nodejs原生实现上传还是比较麻烦,有兴趣的自已去参考一下网上有网友写的代码 这里选择了formidable,也是githu

[js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)

该系列文章索引: [js高手之路]node js系列课程-创建简易web服务器与文件读写 [js高手之路]node js系列课程-图解express+supervisor+ejs用法 [js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息 [js高手之路]Node.js模板引擎教程-jade速学与实战1-基本用法 [js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义 [js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin

node.js express mvc轻量级框架实践

本文记录的是笔者最近抽私下时间给朋友做的一个时时彩自动下注系统,比较简单,主要也是为了学习一下node.js. 其实逻辑没什么可以深谈的,主要是想说说这套代码结构.结构如下图: js的代码比较难以维护,不清楚大家对于这点是否认同,但这里笔者只说自己的感受,笔者的朋友一开始找到笔者,说玩时时彩,一直盯着玩,会因为贪心会乱来,想做个自动下注系统, 让程序自己玩.一开始,笔者也只想敷衍了事,直接拿node.js+express整了下面这套结构. 基本和express 示例代码没啥两样.但是随着需求的变