node+express+mongodb搭建博客

Posted 惊天码盗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node+express+mongodb搭建博客相关的知识,希望对你有一定的参考价值。

绝大多数痛苦来自于你还心存侥幸。

数据库MongoDB

MongoDB 是一个基于分布式文件存储的 NoSQL(非关系型数据库)的一种,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似 于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB 没有关系型数据库中行和表的概念,不过有类似的文档和集合的概念。文档是 MongoDB 最基本的单 位,每个文档都会以唯一的 _id 标识,文档的属性为 key/value 的键值对形式,文档内可以嵌套另一个文档,因 此可以存储比较复杂的数据类型。集合是许多文档的总和,一个数据库可以有多个集合,一个集合可以有多个文档。

安装 MongoDB 很简单,去官网下载对应系统的 MongoDB 压缩包即可。解压后将文件夹重命名为 mongod b,并在 mongodb 文件夹里新建 blog 文件夹作为我们博客内容的存储目录。进入到 bin 目录下,

mongod --dbpath ../blog/

通过指令指定项目存储目录,并启动mongo服务。

但是想要在node项目中使用mongoDB数据库,还需要官方提供的 node-mongodb-native 驱动模块,所以我们要install mongodb包,加入依赖。

下载完之后,我们需要创建一个配置文件setting.js,来管理数据库的基本信息。

module.exports = { 
  cookieSecret: 'myblog'//用于cookie加密
  db: 'blog'//数据库名称
  host: 'localhost',//数据库地址
  port: 27017//数据库端口号
}; 

然后我们在目录下新建一个models文件来专门处理数据库的逻辑。

var settings = require('../setting'),
    Db = require('mongodb').Db,
    Server = require('mongodb').Server;
  module.exports = new Db(settings.db, new Server(settings.host, settings.port), {
    safetrue
  });

node.js操作MongoDB

需要注意的是本次项目中从npm 下载的mongodb的版本是2.2.10.在3.X版本中有些许改变。

一般情况下,我们要操作数据库,第一步是连接数据库,当数据库连接上以后,第二步读取数据库集合,接下来具体操作。

在mongodb中打开数据库用.open(),在之后的版本中此方法被废弃;关闭用.close();

在大部分api中都采用了错误优先的回调方式。

读取集合用.collection();第一个参数为集合名称,第二是为回调函数,处理读取成功和读取失败。

var mongodb = require('./db');//导入new Db()的实例
  //打开数据库
  mongodb.open(function (err, db{
    if (err) {
      return callback(err);//返回错误
    }
    //读取用户集合
    db.collection('users'function (err, collection{
      if (err) {
        mongodb.close();
        return callback(err);
      }
      //插入数据库
      collection.insert(user, {
        safetrue
      }, function (err, user{
        mongodb.close();
        if (err) {
          return callback(err);
        }
        callback(null, user[0]);
      });
    });
  });

当读取成功后,插入数据库,调用insert()方法;设置{safe:true}选项是确保数据是否(insert/update/remove)成功;

MongoDB的insert/update/remove都是异步的,也就是说发出insert命令之后,就不管数据库是否执行成功了。要想知道数据库是否执行成功,需要再发出一个查询请求来获取连接(Connection)的最后一个错误状态。为了简化这个过程,也就支持{safe:true}这个参数,使得insert和错误状态查询能够一起执行,一旦设置这个参数,一定要增加回调函数作为第三个参数。

查询数据用find();一旦用find获取到结果集之后,需要调用toArray方法,并传递回调函数,这个时候才能拿到真正的数据。这里有个有趣的事情需要注意,find本身并不执行查询,它只是返回一个Cursor实例.

  // Cursors don't run their queries until you actually attempt to retrieve data
  // from them.

  // Find returns a Cursor, which is Enumerable. You can iterate:
  collection.find(function(err, cursor{
    cursor.each(function(err, item{
      if(item != nullconsole.dir(item);
    });
  });

  // You can turn it into an array
  collection.find(function(err, cursor{
    cursor.toArray(function(err, items{          
      console.log("count: " + items.length);
  });

查找单个数据,采用findOne(),一个参数是一个查询对象,第二个是回调函数;

collection.findOne({
    "name": name,
    "time.day"day,
    "title": title
}, function (err, doc) {
    mongodb.close();
    if (err) {
        return callback(err);
    }
    callback(null, doc);
});

排序用sort,limit做分页。

collection.find({}, {sort: [['created_at''desc'], ['body''asc']]})
//其中'desc'也可以用-1表示,而'asc'可以用1表示。如果是只有一个sort列,也可以用下面的方式
collection.find({}, {sort: {'created_at'-1}})

collection.find({}, {limit10skip:20})

更新数据,采用update(),$set是操作符,它的值是要更新的数据。这些操作符除了这里的$set,还有其它的$push,$inc, $unset, $pushAll等等

collection.update({
    "name": name,
    "time.day"day,
    "title": title
}, {
    $set: {
        post: post
    }
}, function (err) {
    mongodb.close();
    if (err) {
        return callback(err);
    }
    callback(null);
});

删除数据,用remove();

//根据用户名、日期和标题查找并删除一篇文章
collection.remove({
    "name": name,
    "time.day": day,
    "title": title
}, {
    w1
}, function (err{
    mongodb.close();
    if (err) {
        return callback(err);
    }
    callback(null);
});

获取集合中指定字段的不重复值,并以数组的形式返回,用distinct().

//distinct 用来找出给定键的所有不同值
collection.distinct("tags"function (err, docs{
    mongodb.close();
    if (err) {
    return callback(err);
    }
    callback(null, docs);
});

以上是关于node+express+mongodb搭建博客的主要内容,如果未能解决你的问题,请参考以下文章

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

从无到有,用Nodejs+express+mongodb搭建简易登陆系统

夺命雷公狗---node.js---19之项目的构建在node+express+mongo的博客项目4mongodb在项目中的基本引入

基于NodeJS+Express+mongoDB+Bootstrap的全栈式工程化开发前后端分离博客系统实战

夺命雷公狗---node.js---20之项目的构建在node+express+mongo的博客项目5mongodb在项目中实现添加数据

Node.js | Express+MongoDB 实现简易用户管理系统(项目搭建 | RESTful API架构 | 前后端交互)