安装MongoDB:https://www.mongodb.com/download-center?jmp=nav
安装Mongoose:
$ npm install mongoose --save
一、连接MongoDB在项目根目录下新建/lib/mongo.js
var mongoose = require("mongoose");var db = mongoose.connect(‘mongodb://localhost:27017/myblog‘);module.exports = db
要连接的数据库为myblog
二、Schema一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,不具备对数据库的操作能力,仅仅只是数据库模型在程序片段中的一种表现,可以说是数据属性模型(传统意义的表结构),又或着是“集合”的模型骨架
新建一个用户Schema
在项目根目录下新建/models/users.js
var mongoose = require("mongoose");var db = require(‘../lib/mongo‘);//一个用户模型var UserSchema = new mongoose.Schema({ username : { type:String }, password : {type: String}, avatar : {type: String}, age : { type:Number, default:0 }, description : { type: String}, email : { type: String }, github : { type: String }, time : { type:Date, default:Date.now }});//创建Modelvar UserModel = db.model("user", UserSchema );module.exports = UserModel
user:数据库中的集合名称,当我们对其添加数据时如果user已经存在,则会保存到其目录下,如果不存在,则会创建user集合,然后在保存数据。
拥有了Model,我们也就拥有了操作数据库的金钥匙,就可以使用Model来进行增删改查的具体操作。
Entity
由Model创建的实体,使用save方法保存数据,Model和Entity都有能影响数据库的操作,但Model比Entity更具操作性。
var UserEntity = new UserModel({ name : "hzzly", age : 21, email: "hjingren@aliyun.com", github: ‘https://github.com/hzzly‘});UserEntity.save(function(error,doc){ if(error){ console.log("error :" + error); }else{ console.log(doc); }});
三、封装数据库的CURD在lib文件下新建api.js
采用Promise封装对数据库的操作,避免回调地狱,使得代码能够更好的被读懂和维护。
var UserModel = require(‘../models/users‘);module.exports = { /** * 添加数据 * @param {[type]} data 需要保存的数据对象 */ save(data) { return new Promise((resolve, reject) => { //model.create(保存的对象,callback) UserModel.create(data, (error, doc) => { if(error){ reject(error) }else{ resolve(doc) } }) }) }, find(data={}, fields=null, options={}) { return new Promise((resolve, reject) => { //model.find(需要查找的对象(如果为空,则查找到所有数据), 属性过滤对象[可选参数], options[可选参数], callback) UserModel.find(data, fields, options, (error, doc) => { if(error){ reject(error) }else{ resolve(doc) } }) }) }, findOne(data) { return new Promise((resolve, reject) => { //model.findOne(需要查找的对象,callback) UserModel.findOne(data, (error, doc) => { if(error){ reject(error) }else{ resolve(doc) } }) }) }, findById(data) { return new Promise((resolve, reject) => { //model.findById(需要查找的id对象 ,callback) UserModel.findById(data, (error, doc) => { if(error){ reject(error) }else{ resolve(doc) } }) }) }, update(conditions, update) { return new Promise((resolve, reject) => { //model.update(查询条件,更新对象,callback) UserModel.update(conditions, update, (error, doc) => { if(error){ reject(error) }else{ resolve(doc) } }) }) }, remove(conditions) { return new Promise((resolve, reject) => { //model.update(查询条件,callback) UserModel.remove(conditions, (error, doc) => { if(error){ reject(error) }else{ resolve(doc) } }) }) }}
四、使用在/routers/index.js中使用
var api = require(‘../lib/api‘);router.post(‘/login‘, function(req, res, next) { var user = { username : req.body.username, password: req.body.password }; api.findOne(user) .then(result => { console.log(result) })})router.post(‘/sign_up‘, function(req, res, next) { var user = { username : req.body.username, password: req.body.password, email: req.body.email }; api.save(user) .then(result => { console.log(result) })})router.get(‘/user_list‘, function(req, res, next) { //返回所有用户 api.find({}) .then(result => { console.log(result) }) //返回只包含一个键值name、age的所有记录 api.find({},{name:1, age:1, _id:0}) .then(result => { console.log(result) }) //返回所有age大于18的数据 api.find({"age":{"$gt":18}}) .then(result => { console.log(result) }) //返回20条数据 api.find({},null,{limit:20}) .then(result => { console.log(result) }) //查询所有数据,并按照age降序顺序返回数据 api.find({},null,{sort:{age:-1}}) //1是升序,-1是降序 .then(result => { console.log(result) })})
Express+MongoDB步步为'赢'
标签:维护 tps model data create div pre option get
小编还为您整理了以下内容,可能对您也有帮助:
请教Express 4 中如何使用connect-mongo
简单的介绍下node+express+mongodb这三个东西。
node:是运行在服务器端的程序语言,表面上看过去就是javascript一样的东西,但是呢,确实就是服务器语言,个人觉得在一定层次上比c灵活,java就不提了。反正你只要认为node可以干很多事就行了,绝对不只是web开发。
express:这货呢,就是node的一种框架,node有很多的开源框架,express是一个大神开发的(这尊神已经移驾到go语言的开发去了)。express可以让你更方便的操作node(因为原生的node写起来比较麻烦,而且因为node是事件驱动的,所以有很多异步回调,写多了就看着晕...)
mongodb:这是一种非关系数据库(nosql),太深的东西我也不清楚,反正这货也有很强大的地方,缺点就是不适合数据一致性要求高的比如金融方面的开发。但是优点就快。
总结:也就是说node和mongodb组合起来特别适合一个应用场景——速度快,处理量大的情况。
下面先说说准备工作:(以windows8.1系统环境为例)
1.node:先下载安装nodejs,下载地址http://www.nodejs.org/,安装好了之后检查是否在系统环境变量里自动配置好了path,如果没有,请把node的安装地址配置到path里去。然后在cmd里敲入node,如果可以,那么这一步ok了,很简单吧。
2.express:这个安装分两种,一种是全局安装,一种是本地安装。网络上说的玄乎玄乎的,但是实际操作中你会发现不同的系统环境会出现问题,比如win8.1中文用户名情况下,你得改变npm的全局路径(npm是node模块包管理程序,在你安装好node的时候已经自带npm了),操作:
prefix = 自定义模块目录
cache = 自定义缓存目录
接着安装express(新版本4.X以上要安装express-generator)
npm i -g express(旧版本npm i -g express+版本号)
npm i -g express-generator
(如果想本地安装在和npm同一个目录下,先cd到node_moles目录,再使用npm i express-generator命令,然后再将node_moles目录下的./bin配置到环境变量path里去)
测试:
express -V 成功的话会显示版本号
3.mongodb:这个数据库安装很简单,下载地址http://www.mongodb.org/。安装好了,就在cmd里cd到mongodb安装目录下的bin目录,然后敲命令:
mongod --dbpath="mongodb安装目录\data" --logpath="mongodb安装目录\log\log.txt" --install --serviceName MongoDB --serviceDisplayName MongoDB
操作完,你会发现,你的电脑的服务里多了一个MongoDB服务,没错,就是它,然后你运行这个服务就行了。
正题:搭建简单的node+express+mongodb项目
先在cmd控制台里cd到一个目录下面,记住这你的workspace,然后是用是用express创建一个app项目
express hello-world -e (-e表示支持ejs模板引擎,默认是jaden。什么事模板引擎,比如jsp...太深的我也不懂。本人比较擅长html原生的东西,像这种模板引擎我也是第一次使用,也蛮方便的哦,不过在我看来,没啥用, 我不需要,但是可能你需要...)
然后我们再下载依赖包
npm i (这样就会自动将项目需要的依赖moles安装到项目的moles里去了)
我们cd到hello-world目录下,是用命令
npm start 启动项目(也可以是node ./bin/www,旧版本直接node app.js,因为具体要看package.json里的启动配置了)
我们可以在浏览器地址栏里敲入 http://127.0.0.1:3000/ 这就是你的第一个express创建的node app。
是不是很哈皮。。。
我们研究下express创建项目
你需要了解的项目主要目录为:routes和views,你最好再在项目里新建一个目录叫models(作用后面讲)
routes里index.js配置的都是get和post请求的路径映射关系,很简单的哦。
views里index.ejs就相当于一个html文件,里面就是一些html标签和<%%>标签,感觉和jsp差不多哦。
看起来不错的样子,标准的MVC框架(models里放模型,views里面放展示,routes里面放控制)
上面我们已经生成好了app原型,接着我们设计数据库
cmd命令行里:
mongo //进入数据库
use hello-world //创建项目数据库
db.addUser("shuaige", "123456") //给这个数据库创建了一个叫帅哥的账号,密码123456 (但是我觉得可能我理解的不到位,你也可以不做这个操作)
然后,我们就为这个hello-world数据库创建collection(collection就相当于oracle和mysql里的table)
db.createCollection("users") //创建一个集合,也就是表
db.users.insert({userid: "admin", password: "123456"}) //给users里添加一个文档,也就是一条记录账号admin,密码123456
ok,现在检查一下:
db.users.find() //如果看到你刚刚添加的文档记录,就ok咯
好简单的数据库集合以及文档设置好,我们就回到express创建的node项目里,我们需要:
在models下创建一个user.js,作为实体类映射数据库的users集合
在views下做几个页面(可以用ejs也可以用html,我就用ejs吧)
在routes下的index.js配置路由,也就是请求映射处理
1在models下创建一个user.js,作为实体类映射数据库的users集合
user.js
var mongoose = require("mongoose"); // 顶会议用户组件
var Schema = mongoose.Schema; // 创建模型
var userScheMa = new Schema({
userid: String,
password: String
}); // 定义了一个新的模型,但是此模式还未和users集合有关联
exports.user = mongoose.model('users', userScheMa); // 与users集合关联
2在views下面建index.ejs, errors.ejs, login.ejs, logout.ejs, homepage.ejs。 (index是自带的,不用建)
express-session存入mongodb 怎么识别
关于Express中的session
Express中可以通过增加Connect的session中间件来开启对Session支持。其中至少包括以下几个步骤:
1、首先需要引入connect-mongo模块
1.var MongoStore = require('connect-mongo')(express);
(注:可能是版本的差异,在《Node.js开发指南》一书中使用的是var MongoStore = require('connect-mongo');,在我电脑是这将会导致Node报Cannot read property 'Store' of undefined)
2、使用cookie处理中间件
1.app.use(express.cookieParser());
3、使用Connect的session中间件
1.2
3.4
5.6
app.use(express.session({
secret: settings.cookieSecret,//设置加密字符串
store: new MongoStore({
db:'myapp' //将session存入myapp数据库中
})
}));
4、移动路由处理中间件的位置
1.app.use(app.router);
上面这段代码在Express创建项目时就会生成,主要用于显示地去处理路由,如果删去上述代码,Express也将会隐式地去处理路由。如果你已经显示的使用路由处理中间件你需要将上述代码的位置放在session处理中间件之后。否则在后续通过req.session去设置/读取session过程中你将会得到reg.session是undefined的提示/错误报告。
求教,nodejs如何往mongoDB中批量插入数据
nodejs把数据存到mongodb里方法:
首先,创建一个数据库保存用户信息。
在这个数据库中创建一个名为 users 的集合,并插入一条用户信息。当前没有 users 集合,mongodb 会直接创建它。
> db.users.insert( { "userId":1, "name":"tom", "email":"tom@nodejs.org" })
查找信息可以使用 find 或者 findOne,区别在于 findOne 只会返回一个结果。
db.users.findOne( {"userId": 1})
返回的结果:
{
"_id" : ObjectId("5413be6e9e1c9f9c4386756d"),
"userId" : 1,
"name" : "tom",
"email" : "tom@nodejs.org"
}
驱动程序
编辑 package.json, 添加对于 mongodb 的引用。
{
"name": "express-api",
"version": "0.0.1",
"dependencies": {
"express": "2.5.9",
"ejs": "0.4.2",
"mongodb": "1.4.1"
}
}
重新 npm install 安装 mongodb 的驱动。
使用 MongoDB 数据库
修改代码,首先 require mongodb 模块,然后连接到 mongodb 数据库。
var mongo = require("mongodb");
var express = require("express");
var app = express.createServer();
app.set("view engine", "ejs");
app.set("views", __dirname + "/views");
app.set("view options", { layout: false });
app.get("/", function (request, response) {
response.render("index");
});
app.get("/user/:id", function (request, response) {
var id = request.params.id;
console.log(id);
app.users.findOne({ "userId": +id }, function (error, doc) {
if (error) return next(error);
response.json(doc);
});
});
// connect mongodb
var server = new mongo.Server("127.0.0.1", 27017);
var db = new mongo.Db("members", server, {safe:true }).open(function (error, client) {
if (error) throw error;
console.log("\033[96m + \033[39m connected to mongodb");
app.users = new mongo.Collection(client, "users");
client.ensureIndex("users", "userId", function (error) {
if (error) throw error;
console.log("\033[96m + \033[39m ensured index.");
console.log("Web Server listening ......");
app.listen(3000);
});
});
注意现在是到数据库中查找用户。id 前面的 + 用来将表单中的字符串类型数据转换为需要的数字类型。
app.users.findOne({ "userId": +id }, function (error, doc) {
if (error) return next(error);
response.json(doc);
});