Node.js+Express+MongoDB 建站实例

本项目为系列博客,目前有以下系列

本文源码请看 https://github.com/jiaoyanlin/myNodeProject/tree/c5237306394c4896aee804a3d378dd2a92be24e0

一、源码运行


npm install

npm start 或 supervisor bin/www(必须提前安装supervisor)

备注:本项目建立在本地已经搭建好了nodejs和mongodb的基础上(搭建方法请自行百度)。

二、以下用来记录项目从头开始搭建的流程

初始化项目

  1. 安装Express

    npm install -g express

  2. 安装Express命令行工具

    npm install -g express-generator

  3. 使用express初始化项目:这里使用ejs模板,默认为jade模板

    express -e myproject

    提示:此时将在当前目录下创建myproject子目录,并自动搭建其他相关目录及文件。

    cd myproject 进入项目目录

    npm install 安装相关依赖

  4. 运行项目

    SET DEBUG=myproject:* & npm start

    此时在浏览器上输入http:localhost:3000将能看到相关页面

  5. 若不想每次修改代码后都要重启服务器,可以安装并使用supervisor工具实现代码修改和自启动

    npm install -g supervisor

    supervisor bin/www

    提示:express 4.x把原来用于项目启动代码也被移到./bin/www的文件,所以直接运行 supervisor bin/www就可以了(更早版本使用 supervisor app.js

实战热身(实现基础的get和post的ajax请求)

  1. 安装mongodb模块(须先在电脑上安装过mongodb并且启动服务)

    npm install mongodb --save

    ps: "crypto": "^1.0.1",未确定是否需要安装?????

  2. 修改/routes/index.js,新增两个接口

    var express = require('express');
    var router = express.Router();
    
    // 我新增的api,用于连接到数据库
    var api = require('./api.js')
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
    });
    
    // 我新增的测试接口
    router.get('/api/test', api.test)
    
    router.post('/api/addtest', api.addtest)
    
    module.exports = router;
    
    
  3. 新增文件1 /routes/api.js

    const db = require('./db.js')
    
    exports.test = function(req, res, next) {
      db.find('mytest', { "query": {} }, function(err, result) {
        if (err) {
          return res.json({
            "code": 404,
            "message": "数据查询失败",
            "result": []
          })
        }
        return res.json({
            "code": 200,
            "message": "数据获取成功",
            "result": result,
            "total": result.length
        })
      })
    }
    
    exports.addtest = function(req, res, next) {
      let newData = {
        "title": req.body.title,
        "content": req.body.content
      };
      // 插入到数据库
      db.insertOne('mytest', newData, function(err, result) {
        if (err) {
          return res.json({
            "code": 401,
            "message": "test新增失败"
          })
        }
        return res.json({
          "code": 200,
          "message": "test新增成功"
        })
      })
    }
    

    新增文件2 /routes/db.js(封装了对数据库的增删查改的函数)

    const MongoClient = require('mongodb').MongoClient
    const settings = require('./settings')
    // 链接数据库 如果没有自动创建
    function _connectDB(callback) {
      let url = settings.dbUrl
      MongoClient.connect(url, function(err, db) {
        if (err) {
          callback(err, null)
          return
        }
        // 数据库链接成功执行回掉
        callback(err, db)
      })
    }
    
    // 插入数据
    exports.insertOne = function(collectionName, json, callback) {
      _connectDB(function(err, db) {
        db.collection(collectionName).insertOne(json, function(err, result) {
          if (err) {
            callback(err, null)
            db.close()
            return
          }
          callback(err, result)
          db.close()
        })
      })
    }
    
    // 查找数据
    exports.find = function(collectionName, queryJson, callback) {
      _connectDB(function(err, db) {
        let json = queryJson.query || {},
          limit = Number(queryJson.limit) || 0,
          count = Number(queryJson.page) - 1,
          sort = queryJson.sort || {}
        // 页数为0或者1都显示前limit条数据
        if (count <= 0) {
          count = 0
        } else {
          count = count * limit
        }
    
        let cursor = db.collection(collectionName).find(json).limit(limit).skip(count).sort(sort)
        cursor.toArray(function(err, results) {
          if (err) {
            callback(err, null)
            db.close()
            return
          }
          callback(err, results)
          db.close()
        })
      })
    }
    
    // 删除数据
    exports.deleteMany = function(collectionName, json, callback) {
      _connectDB(function(err, db) {
        db.collection(collectionName).deleteMany(json, function(err, results) {
          if (err) {
            callback(err, null)
            db.close()
            return
          }
          callback(err, results)
          db.close()
        })
      })
    }
    
    // 修改数据
    exports.updateMany = function(collectionName, jsonOld, jsonNew, callback) {
      _connectDB(function(err, db) {
        db.collection(collectionName).updateMany(
          jsonOld, {
            $set: jsonNew,
            $currentDate: { "lastModified": false }
          },
          function(err, results) {
            if (err) {
              callback(err, null)
              db.close()
              return
            }
            callback(err, results)
            db.close()
          })
      })
    }
    

    新增文件3 /routes/settings.js(mongodb数据库相关设置)

    let nickname = 'myproject1'
    module.exports = {
        dbUrl:'mongodb://localhost:27017/myproject1',
        nickname:nickname
    }
    

    到此,接口创建完毕

  4. 前端使用ajax来获取数据

    /views/index.ejs

    <!DOCTYPE html>
    <html>
      <head>
        <title><%= title %></title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
        <script src='/js/jquery.min.js'></script>
      </head>
      <body>
        <h1><%= title %></h1>
        <p>Welcome to <%= title %></p>
        <div class="post">
          <input type="text" class="title" placeholder="请输入标题">
          <input type="text" class="content" placeholder="请输入标题">
          <button class="ok">提交</button>
        </div>
        <div class="test"></div>
      </body>
      <script>
        function getList() {
          $.get('/api/test', {}, function (data) {
            console.log('----data', data)
            if (data.code == 200) {
              var html = '', list = data.result;
              for (var i = 0; i < list.length; i++) {
                html += '<div>这是第' + i + '条数据:标题为' + list[i].title + ',内容为' + list[i].content + '</div>'
              }
              $('.test').empty().append(html);
            }
          })
        }
        getList();
        $('.ok').click(function() {
          if (!$('.title').val()) {
            alert('请填写标题');
            return false;
          }
          if (!$('.content').val()) {
            alert('请填写内容');
            return false;
          }
          $.post('/api/addtest', {
            title: $('.title').val(),
            content: $('.content').val()
          }, function (data) {
            console.log('----addtest', data)
            if (data.code == 200) {
              alert('提交成功');
              getList();
            } else {
              alert('提交失败');
            }
          })
        })
      </script>
    </html>
    

    打开浏览器控制台,可以看到打印出查到的数据。

说明

文章只是分享我的一些学习历程,如果有错误,求轻拍,我一定虚心受教。我从事前端行业不久,很多东西理解还有偏差,不足之处,请多见谅,很多东西没写详细,后期有时间会再补上。此外这个项目后面我想继续完善下去,当前只是写个小demo试一下而已,请继续关注,如果可以的话可以到我GitHub上面给个星鼓励下哦。

下一篇介绍登录模块的做法:
http://www.jianshu.com/p/f203f4bd55a8

参考文档

1、http://y.dobit.top/Detail/150.html

2、https://github.com/wmui/vueblog

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容