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), {
safe: true
});
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, {
safe: true
}, 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 != null) console.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({}, {limit: 10, skip: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
}, {
w: 1
}, 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架构 | 前后端交互)