a.安装mongoose库用来链接mongodb数据库  


  安装mongodb数据库参考mongodb安装

  前言(怨言)

  本来是想安装mongodb库来链接mongodb的,命令行到nodejs工程目录:npm install mongodb --save

  

  但是发现报gyp ERR! stack Error:Can't find python executable "python"错误,缺少python运行环境。

  我晕死,我链接mongodb还需要Python,这不是存心让用户找虐。查到有个网友说相同的库还有mongoose, mongoskin,他们都比mongodb更有好用。果断放弃mongodb,使用mongoos。

  使用命令:npm install mongoose --save

  

  一下ok了。

b.mongoose的使用


  首先我们要知道mongoose建立数据库有点类似普通的关系数据先定义结构,然后填写字段,不想普通的noSql数据库操作。所以这里有一些概念需要明白

  • Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力

  • Model : 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对

  • Entity : 由Model创建的实体,他的操作也会影响数据库

  在使用mongoose构建和操作数据库时,先定义数据库每条数据(普通关系数据库中的一行)的结构,也就是Schema,然后由Schema生成一个model。这个model拥有操纵由Schema结构构成的的整个表格中的数据的能力(包括增删改查等)。可以由model创建一个个的实体数据,每个实体数据结构和Schema定义的结构相同。

  下面直接上实例

//记账本
var pocketBookSchema = new mongoose.Schema({
name: String, //定义一个属性name,类型为String
brand: String, //品牌
unitPrice: Number, //单价
quantity: Number, //数量
allPrice: Number, //总价
picture: String, //照片路径
date: String, //日期"2016-01-01"
_saveData: Date, //保存数据的日期
remark: String //备注
});
var pocketBookModel = db.model('pocketBook',pocketBookSchema);
//如果该Model已经发布,则可以直接通过名字索引到,如下:
//var pocketBookModel = db.model('pocketBook'); var info ={
name: req.body.name,
brand: req.body.brand,
unitPrice: req.body.unitPrice,
quantity: req.body.quantity,
allPrice: req.body.allPrice,
picture: req.body.picture,
date: req.body.date,
remark: req.body.remark,
_saveData: new Date()
}
//创建一个实例
pocketBookEntity = new pocketBookModel(info);
//保存数据库
pocketBookEntity.save(function(err) {
if (err) {
console.log('记账本添加一条数据失败');
return;
}
console.log('记账本添加了一条数据');
});

  上面就是使用mongoose添加一条数据的例子,当然,真实的项目中还需要连接mongodb数据库,然后增删改查都是通过url请求来处理的。本人这里举一个完整的例子。

  我的nodejs主程序是server.js,在同一级目录下我新建了一个initdb.js用来链接数据库和初始化所有需要用到的Schema和相应的model(这里只用了一个).

  initdb.js源码如下

var mongoose = require('mongoose');    //引用mongoose模块
var db = mongoose.createConnection('192.168.0.174','chuayyqing'); db.on('error',console.error.bind(console,'连接错误:')); //记账本
var pocketBookSchema = new mongoose.Schema({
name: String, //定义一个属性name,类型为String
brand: String, //品牌
unitPrice: Number, //单价
quantity: Number, //数量
allPrice: Number, //总价
picture: String, //照片路径
date: String, //日期"2016-01-01"
_saveData: Date, //保存数据的日期
remark: String //备注
});
var pocketBookModel = db.model('pocketBook',pocketBookSchema);
//如果该Model已经发布,则可以直接通过名字索引到,如下:
//var pocketBookModel = db.model('pocketBook'); exports.pocketBookModel = pocketBookModel;

  server.js如下

  

var express = require("express");
var app = express();
var bodyParser = require('body-parser');
// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })
var models = require("./initdb"); //指定静态文件路劲static,可以直接访问static下的文件test.png:http://localhost:8080/test.png
app.use(express.static('chuayyqing/static')); //查询记账本列表
app.get("/pocketBook-list",function(req,res){
models.pocketBookModel.find(function(err,pockets){
res.send(pockets);
})
})
//往记账本添加一条记录
app.post("/pocketBook-addOrUpdateOne",urlencodedParser,function(req,res){
/*info = {
name: req.body.name,
brand: req.body.brand,
unitPrice: req.body.unitPrice,
quantity: req.body.quantity,
allPrice: req.body.allPrice,
picture: req.body.picture,
date: req.body.date,
remark: req.body.remark,
_saveData: new Date(); }*/
var info = req.body;
info._saveData = new Date(); console.log(info)
//有_id表示是更改一条数据
if(info._id){
var query = { _id: req.body._id };
models.pocketBookModel.findOneAndUpdate(query,info,function(err){
if (err) {
console.log('记账本修改一条数据失败');
res.send({code:500});
return
}
console.log('记账本修改了一条数据');
res.send({code:200});
}); //否则是新增一条数据
}else{
//如果没有发布,上一段代码将会异常
var pocketBookEntity = new models.pocketBookModel(info);
//保存数据库
pocketBookEntity.save(function(err) {
if (err) {
console.log('记账本添加一条数据失败');
res.send({code:500});
return;
}
console.log('记账本添加了一条数据');
res.send({code:200});
});
}
})
//删除记账本的一条记录
app.post("/pocketBook-deleteOne",urlencodedParser,function(req,res){
models.pocketBookModel.remove({_id: req.body.id},function(err){
if (err) {
console.log('记账本删除数据失败');
res.send({code:500});
return;
}
console.log('记账本删除了一条数据');
res.send({code:200});
})
}) var server = app.listen(8080,function(){
var host = server.address().address;
var port = server.address().port; console.log("应用实例,访问地址为 http://%s:%s", host, port)
})

  增删改查数操作上面就都有了。只要弄几个简单的网页就可以把server.js跑起来了。

  里面express的用法可以参考菜鸟教程expres基础

  如果觉得本文不错,请点击右下方【推荐】!

  

  

  

nodejs学习笔记二——链接mongodb的更多相关文章

  1. nodejs学习笔记二:解析express框架项目文件

    上一章介绍了如何去创建一个express框架的工程项目,这章介绍一下express框架下的文件和用法解析,上一张我们创建的工程项目结构图如下: models是不属于原工程项目结构,为了实现数据模型后添 ...

  2. nodejs学习笔记<二>简单的node服务器

    在环境搭建好后,就可以开始动手架设(node驱动)一个简单的web服务器. 首先,nodejs还是用js编写.先来看一段node官网上的实例代码. var http = require('http') ...

  3. nodejs学习笔记<二> 使用node创建基础服务器

    创建服务器的 server.js 内容. var http = require("http"); // 引用http模块 http.createServer(function(re ...

  4. nodejs学习笔记二(get请求、post请求、 querystring模块,url模块)

    请求数据 前台:form.ajax.jsonp 后台:接受请求并返回响应数据     前台<= http协议 =>后台   常用的请求的方式: 1.GET           数据在url ...

  5. NodeJS学习笔记二

    类声明和类表达式 ES6 中的类实际上就是个函数,而且正如函数的定义方式有函数声明和函数表达式两种一样,类的定义方式也有两种,分别是:类声明.类表达式. 类声明 类声明是定义类的一种方式,就像下面这样 ...

  6. Nodejs学习笔记(四)——支持Mongodb

    前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...

  7. Nodejs学习笔记(二)——Eclipse中运行调试Nodejs

    前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...

  8. MongoDB学习笔记二- Mongoose

    MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...

  9. Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识

    目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...

随机推荐

  1. iOS应用内跳转系统设置相关界面的方法

    在iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等.在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个pre ...

  2. blender 2.6 快捷键

    右键单击 选中 A 取消选择/全选 中键拖动 旋转 中键滚动放大/缩小 Shift+中键拖动 平移 右上斜线三角区域拖动 产生新视窗 Shift+c准星复位 Num1前视图 Ctrl+Num1后视图 ...

  3. Remote Desktop Connection Manager (RDCMan)

    当前最新版本是 v2.7. 通过这款软件,我们便可以轻松的管理和访问数个RDP.左边的列表中我们可以创建总的分区列表(即 RDCMan Group),该列表保存采用的是RDG扩展名,使用时通过&quo ...

  4. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  5. C#使用Timer.Interval指定时间间隔与指定时间执行事件

    C#中,Timer是一个定时器,它可以按照指定的时间间隔或者指定的时间执行一个事件. 指定时间间隔是指按特定的时间间隔,如每1分钟.每10分钟.每1个小时等执行指定事件: 指定时间是指每小时的第30分 ...

  6. .NET Core 1.0-最简单的Hello world控制台程序

    使用任意的文本编辑软件,新建两个文件 1.Program.cs using System; using System.Collections.Generic; using System.Linq; u ...

  7. [后端人员耍前端系列]Bootstrap篇:30分钟快速掌握Bootstrap

    一.引言 很久没有写过博客了,但是最近这段时间都没有闲着,接触了很多方面.比如一些前端框架和组件.还有移动开发React-Native.以及对.NET框架设计的一些重新认识.这些内容在接下来的时间都会 ...

  8. 图解,为多个oracle数据库下添加ArcSde实例

    最开始肯定要先建一个oracle数据库,我假设名称为dbgis 1, 2, 3, 不重新指定就会出现这个错误,因为以前有sde.dbf文件了 4, 5, 6, 7, 8, 如果以前授权成功过就会出现这 ...

  9. 用JS识别各版本浏览器

    自昨天发了各浏览器内核介绍的随笔,就闲不住了,想直接写个JS来识别用户所用浏览器版本. 写着写着却发现很多坑爹的地方,比如IE10-的版本是依循常规支持attachEvent,但到了IE11,却只支持 ...

  10. 渣渣小本求职复习之路每天一博客系列——TCP/IP协议栈(5)

    前情回顾:一篇短短的博客明显不能满足TCP和UDP这两个饥渴的汉子,而且还被应用协议占了一小半的篇幅.在昨天结束之后,相信大家都基本对TCP/IP协议栈的轮廓有一个大概的印象了,能够对整体有所把握. ...