怎么用node.js访问nodejs mongodb 查询并查询数据,是要先在nodejs mongodb 查询上录入数据吗?还是不需要,

11968人阅读
pomelo(2)
虽然 NodeJS 的模块和开发资源相当多,但相关文件却非常不足或是不完整,多半文献都只着重于基础的使用和片断的说明,如果不去看源代码,使用 NodeJS 来完成实用的网站,会有很大的困难度。对于已经有过 Web 开发经验的人,转换使用 NodeJS 不免也需要花一番功夫,过去经验中许多的常用的功能,都仍要一一花大量时间尝试才得以解决。而这样的情况,对于开发者来说相当的糟,也是很多人重新再评估是否使用 NodeJS 的重点因素之一。有道是”一人得道,鸡犬升天”,因此笔者未来将尝试将自己的实际经验,写成一篇篇重点功能实现的文章和随
Copy 即用的范例,减少其他人浪费同样的时间再摸索。
开发一个 Web 应用程序,最重要的莫过于数据库的使用,过去 PHP 有 MySQL 当最佳伙伴,而现在 NodeJS 有 MongoDB 做最佳的组合。MongoDB 是 NoSQL 的代表之一,其采用 JSON/BSON 当做数据储存和沟通的格式,亦使用 JavaScript 做为 Server-side 的执行程序语言(相当于传统 RDBMS 的预储程序),一切设计和习惯与 NodeJS 搭配使用起来,简直绝配。若你对 MongoDB 的一些基本操作有疑问,可以先参考旧文”MongoDB 快速笔记”。
使用 MongoDB
MongoDB 拥有 NoSQL 的普遍特色,不用预先定义 Schema,所有的 database 和 collection(相当于传统 RDBMS 的 Table),都会在新增数据后,自动被建立,我们只要专注于使用 NodeJS 操作数据库即可。
要在 NodeJS 里使用 MongoDB,可以安装 mongodb native driver,若透过 npm 来安装:
npm install mongodb
然后可以使用 NodeJS 建立 MongoDB connection pool ,做一些基础的操作:
var mongodb = require('mongodb');
var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 });
var db = new mongodb.Db('mydb', mongodbServer);
/* open db */
db.open(function() {
/* Select 'contact' collection */
db.collection('contact', function(err, collection) {
/* Insert a data */
collection.insert({
name: 'Fred Chien',
email: '',
'0926xxx5xx',
'0912xx11xx'
}, function(err, data) {
if (data) {
console.log('Successfully Insert');
console.log('Failed to Insert');
/* Querying */
collection.find({ name: 'Fred Chien' }, function(err, data) {
/* Found this People */
if (data) {
console.log('Name: ' + data.name + ', email: ' + data.email);
console.log('Cannot found');
注:这是 MongoDB 的基本常识,每当新增一笔数据,MongoDB 会自动帮该笔数据加上 _id 字段,并给与一个唯一值(格式是 ObjectId),所以我们不需要像过去 使用 SQL Server 一般,自己刻意去定义一个 ID 字段。
预设的 ObjectId 范围太小,改用 UUID 来当数据的唯一 ID
如果你过去有过 Web 开发经验,到这边肯定会开始有一些疑问欲求解,第一个问题肯定是”ObjectId 的数量极限?”。笔者在此不会回答这问题,因为这答案并不重要,想要准确知道答案,可以去”
“寻找答案。
比起上述问题,相信你应该更想问:
预设的 ObjectId 适用的范围?
如果日后数据库要扩展(Scale),是否有其他的 ID 解决方案可使用?
一般情况, MongoDB 预设的 ObjectId 就相当够用了,但如果你是要建构大型的 Web Service 或是保留未来的扩充性,可使用 UUID 去代替 ObjectId。不过,因为 MongoDB 本身并不生成 UUID,若是要使用 UUID,就必需先自行产生好 UUID,然后在新增数据时指定生成好的 UUID 给 _id 字段,让 MongoDB 改用我们给的 ID 而不使用预设生成的 ObjectId。
因为要自行产生 UUID,必需先为 NodeJS 安装模块 node-uuid:
npm install uuid
然后生成 UUID 并在 insert 时使用:
var uuid = require('node-uuid');
var mongodb = require('mongodb');
var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 });
var db = new mongodb.Db('mydb', mongodbServer);
/* open db */
db.open(function() {
/* Select 'contact' collection */
db.collection('contact', function(err, collection) {
/* Generate UUID(16 Bytes) and convert to BinaryData object for mongodb */
var uuidBinary = new Buffer(uuid.v1({}, []));
var id = mongodb.BSONPure.Binary(uuidBinary, mongodb.BSONPure.Binary.SUBTYPE_UUID);
/* Insert a data with uuid */
collection.insert({
name: 'Fred Chien',
}, function(err, data) {
if (data) {
console.log('Successfully Insert');
console.log('Failed to Insert');
你可能会发现,在上面的范例程序中,我们将 UUID 转成 MongoDB BSON 的 BinaryData 格式,这是为了效能考虑,因为用纯字符串当做 Unique ID,在数据库搜寻上会比 BinaryData Object 慢很多。
储存时间戳(Timestamp)
关于储存时间的问题,如果你去各大 MongoDB 讨论区询问或查询,通常大家都会告诉你不必做这件事,因为每一笔数据被建立后,自动产生的 ObjectId 就包含了建立的时间讯息,我们只要去学习如何从中去解析时间即可。但是,不单只是建立时间,有时我们会为数据加上各种不同的时间戳,如:更新时间等,所以,储存时间戳还是必要的。
虽然网络上相关 NodeJS 范例并不多,但 MongoDB 确实有 Timestamp 的数据结构可以用,我们可以这样使用:
var uuid = require('node-uuid');
var mongodb = require('mongodb');
var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 });
var db = new mongodb.Db('mydb', mongodbServer);
/* open db */
db.open(function() {
/* Select 'contact' collection */
db.collection('contact', function(err, collection) {
/* Generate Timestamp and convert for mongodb */
var ts = new Date().getTime();
var i = ts % 1000;
var t = new mongodb.BSONPure.Timestamp(i, Math.floor(ts * 0.001));
/* Insert a data with uuid */
collection.insert({
name: 'Fred Chien',
email: '',
created: t
}, function(err, data) {
if (data) {
console.log('Successfully Insert');
console.log('Failed to Insert');
建立数据库索引(Index)
过去有接触过数据库的人应该都很清楚,索引(Index)是能优化数据查询速度的重要功能,MongoDB 同样也有索引的设计。
可以在 NodeJS 中,这样为 name 字段加上索引:
collection.createIndex({ name: 1 });
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:411450次
积分:4585
积分:4585
排名:第3986名
原创:56篇
转载:183篇
评论:26条
(1)(1)(1)(2)(3)(5)(3)(26)(5)(10)(10)(24)(2)(11)(8)(28)(1)(4)(3)(3)(15)(5)(2)(1)(11)(2)(2)(4)(5)(10)(9)(2)(2)(1)(3)(1)(1)(1)(1)(3)(1)(1)(1)(2)(3)(8)(1)(10)(1)(1)(2)(11)trackbacks-0
最近在做nodejs的web开发,初次接触到mongoDB这个数据库。
其实之前对关系型数据库的接触也不是很多,不过在刚接触使用mongoDB的时候还是习惯性的把关系型数据库的设计思维带了进去。在设计数据库的时候,还是把一些关系型数据库设计的思维带进去了,没有发挥出mongoDB文档型数据库的优势。mongoDB可以方便的把一些本来mySQL需要通过一对多关系关联的数据通过数组+对象的方式作为一个文档存储到一个collections里面,并且提供了各种API支持对一个文档里面的数组进行操作。
此次实践选用的node中间件是mongoskin,不过惭愧的是基本没有用到mongoskin的太多特性,基本当作node-mongodb-native来使用。不过写完之后,对于mongoDB的查询API以及node同mongoDB的交互有了一定的了解。
MongoDB常用查询方法与在node中的体现:
1)数据库连接 mongoDB: mongo -u username -p password host:port/dbs node+mongoSkin: require(“mongoskin”).db(username:password@host:port/dbs);
2)索引 person.ensureIndex({“name”:1},{“unique”:true}, callback);第一个参数是selector,第二个参数是选项,有unique(唯一索引)等mongoDB索引选项。ensureIndex先查找是否存在这个索引,如果不存在,则建立索引,因此不会出现重复建立的情况。3)新建数据person.save({“name”:”jobs”, age:32, gender:”male”}, callback);person.save({“name”:”tim”, age:29, gender:”male”}, callback);4)查询 findOne方法:查询符合selector条件的结果,取第一条给callBack,err是错误信息,如果没有错误,则为undefined,data数据为一个js对象。 person.findOne({“name“:”jobs”}), callBack(err, data));
find方法:查询符合selector条件,并且还可以加入一系列参数,最后通过toArray方法,把数据生成数组的方式传递给callback。 person.find({“gender”:”male”},{sort:[['name', 1]],skip:pageNum*(page-1), limit:pageNum}).toArray(callback(err, data){}) 同时查询的时候可以通过$in,$gt,$lt等方式来确定selector的范围。
5)更改 有两点要注意:1.update方法如果是要更新文档中的一个或几个属性的时候,必须要用形如{$set:{age:33}}的形式,如果写成{age:33}的形式,则这个文档的其他内容都会被删除,只剩{age:32}这一个属性。 2.update方法默认是只更新找到的第一个文档,如果需要所有的文档都更新,则需要在option部分再加上{multi:true},如果想要在查找不到这条记录的时候新增一条,则要在option部分加上{upsert:true}。 person.update({“name”:”jobs”}, {$set{“age”:33}}, {multi:true}, callback(err))
6)删除 person.remove({“name”:”jobs”},callback(err){});
7)selector中使用mongoDB自动生成的_id mongoDB会为每一个文档生成一个_id属性,类似于mySQL的主键,是唯一的。_id的类型是mongoDB自己定义的objectID类型,因此尽管在查询的时候可以得到一个12位或者24位的_id字符串,但是如果想在selector里面通过_id进行查找或其他操作的时候,必须要先通过db.collection.id()方法进行类型转换。 person.remove({“_id”:person.id(stringID)}, callback(err){});
8)mongoDB对文档内的数组进行操作(通过update方法) 1.通过$addToSet方法向数组中插入记录,插入前该方法会先查找是否存在这条记录,如果存在则不插入。如果想要插入重复的值,则可以通过$push进行添加。 person.update({“name”:”jobs”}, {$addToSet: {company: {name: “google”,address: USA,workingTime: 3}}, function(err){});
2.修改数组中的数据:通过$符。如果在数组中查询的时候要匹配两个属性,必须要使用$elemMatch方法,如果只通过{"name":”google”, "address":USA}去查找,会选择到所有name为google或者address为USA的元素。在定位到这个元素之后,通过$来选定它进行修改。 person.update({
“name”:”jobs”,
company:{$elemMatch:{"name":”google”, "address":USA}}
}, {$set:{"company.$.workingTime":4}},function(){})
3.删除数组中的数据:通过$pull方法 person.update({
“name”:”jobs”,
},{$pull:{company:{“name”:”google”, “address”:”USA”}}},function(err){})
阅读(12457)
阅读排行榜
评论排行榜从零开始搭建Node.js, Express, Ejs, Mongodb服务器
本文改自非鱼的《【翻译】前端开发人员入门指南,从零开始搭建Node.js, Express, Jade, Mongodb服务器》,之所以把Jade换成Ejs,是因为我觉得ejs更符合WEB编程人员的习惯,更确切说应该是更符合PHP、ASP程序员的使用习惯。好了,废话不多说,直接开始教程。
第1部分 – 15分钟安装
如果你真的是从零开始学,那就花点时间先把环境搭建起来吧。这不难,我用的是Win8,所以这看上去跟那些用Mac和Ubuntu或者其它*nix系统的教程有点区别,不过大致是一样的。
第1步 – 安装Node.JS
这很容易,进入,点击绿色的大Install按钮,它会自动检测你的系统并给你一个正确的安装文件的下载。(如果没有,点击Download按钮选择你需要的下载)。运行安装程序,这样就好了。你已经装上了Node.js,和NPM(Node包管理器)可以让你很容易的安装各种有用的包到Node里。
打开一个终端窗口
cd进入一个你想存放你的测试App的目录,比如c:\node
第2步 – 安装Express
现在我们已经让Node跑起来了,我们还需要一些东西让我们能够实际创建一个可用的站点。下面我们需要安装Express,这是一个把Node从一个原始的应用变成一个更像我们平时使用的Web服务器的框架。我们需要从Express开始,因为我们需要它提供的scaffolding功能。我们输入这么个命令:
c:\node&npm install -g express
这样Express就被正确的安装到我们的Node里了,并且已经设为全局可用的。你会在命令行窗口看到一堆输出,大部分是http 304和GET请求,这是正常的。Express应该已经装好并可用了。
第3步 – 创建一个Express项目
我们准备使用Express和Ejs,但是不是用来做CSS预处理的。我们会手写一些CSS。我们要用Ejs或者其它的模板引擎来处理Node和Express的数据。如果你会HTML的话,Ejs并不难。只要记住你需要集中精神,否则事情可能很容易出错。
现在在同一个命令行窗口中输入:
c:\node&express –sessions nodetest1
回车,你会看到这样一堆东西:
C:\node&express --sessions nodetest1
create : nodetest1
create : nodetest1/package.json
create : nodetest1/app.js
create : nodetest1/routes
create : nodetest1/routes/index.js
create : nodetest1/routes/user.js
create : nodetest1/views
create : nodetest1/views/index.ejs
create : nodetest1/public/images
create : nodetest1/public/javascripts
create : nodetest1/public
create : nodetest1/public/stylesheets
create : nodetest1/public/stylesheets/style.css
install dependencies:
$ cd nodetest1 && npm install
run the app:
$ node app
第4步 – 编辑依赖项
好了,我们现在有一些基本项目结构,但是还没完。你会注意到express的安装过程在你的nodetest1目录里创建了一个叫package.json的文件,用文本编辑器打开这个文件,它应该是长这样的。
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node app.js"
"dependencies": {
"express": "3.4.8",
"ejs": "*"
这是一个标准的JSON格式文件,表明了我们的应用和它的依赖。我们需要添加一点东西。比如对mongodb和Monk的调用。把dependencies部分改成这样:
"dependencies": {
"express": "3.4.8",
"ejs": "*",
"mongodb": "*",
"monk": "*"
第5步 – 安装依赖
现在我们定义好了项目的依赖项。*号会告诉NPM“安装最新版本”。回到命令行窗口,进入nodetest1目录,输入:
C:\node\nodetest1&npm install
它会输出一堆东西。这是因为它直接读取我们修改过的JSON文件,识别其中的依赖项,并安装必须的文件。当NPM安装完成以后,你应该有了一个node_modules目录,其中包含我们的项目所需要的所有依赖文件。
现在我们有了一个完整功能的App,并且可以运行了。我们试试看吧!确保你的当前目录是nodetest1目录,输入:
C:\node\nodetest1&node app.js
回车后你会看到:
Express server listening on port 3000
太棒了。打开浏览器,输入http://localhost:3000,你应该能看到Express的一个欢迎页面了。
现在你已经运行起了你自己的Node JS WebServer,带有Express引擎和Ejs HTML模板引擎。不是很难啊,对吧?
第2部分 – 好了,我们来写“Hello, World!”吧
打开你常用的文本编辑器或者其它IDE,我个人喜欢用Sublime Text。打开你的nodetest1目录下的app.js,这个文件就是你的App的核心了。你应该会看到这样的内容:
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
这个只是定义了一堆JavaScript变量并指向了一些包和依赖,node函数,和routes。Routes(路由)相当于MVC中Models和Controllers的集合,它负责转发请求并且也包含一些处理逻辑。Express已经为我们创建好了所有这些东西,我们现在先忽略user route,开始写最顶层的route(由routes\index.js控制)。
在上面的这个文件的最后写上:
var app = express();
这一句至关重要。它实例化了Express并赋值给我们的app变量。接下来的内容都要使用这个变量来配置一堆Express的参数。继续输入:
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
这里设置了端口,寻找views的目录,用什么模板引擎来处理这些views,和一些其它的东西。还要注意最后一行,它告诉Express把public/目录下的静态文件作为顶层目录的文件来托管。比如你的图片目录存放在c:\node\nodetest1\public\images\里,但是实际访问地址是http://localhost:3000/images/。
注意:你需要把这一行
app.use(express.bodyParser());
app.use(express.urlencoded());
这是为了忽略一些App运行过程中Node窗口里面的警告信息。主要是一些Express和它的插件未来可能的修改。如果你不做这个修改,程序运行时你会收到一堆某某函数即将过期的警告。
然后增加:
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
这样在开发过程中你可以做一些错误检查。
继续增加:
app.get('/', routes.index);
app.get('/users', user.list);
这会告诉路由当一个URI请求到达时使用哪个Route来处理。注意user变量是在前面定义的,并被map到了/routes/user.js,我们会调用这个文件中定义的list函数。这里可以显示用户列表。
继续增加:
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
最后,创建一个http server并且启动它。这样就差不多了。
(以上内容在新的express生成的模板里是完整的,不需要自己写进去)
现在,我们写点有用的。我们不会直接在我们的index页面里写“Hello World!”,我们借这个机会学习一下如何使用route路由,同时学习一下Ejs引擎是如何工作的。在上面的app.js文件的app.get()这一段的后面添加一行:
app.get('/helloworld', routes.helloworld);
如果这时候你在命令行窗口按ctrl+C结束app.js进程再重启,然后用浏览器访问http://localhost:3000/helloworld,你会得到一个很激动人心的node错误和命令行窗口中的一堆崩溃提示。这是因为我们还没有修改路由去处理这个路径。来做这个吧。在你的编辑器里,进入routes目录,找到index.js,打开它。它看上去应该是这样的:
* GET home page.
exports.index = function(req, res){
res.render('index', { title: 'Express' });
我们来添加一个新页面。我比较喜欢给每一个一级目录创建一个独立的route文件,但是现在我们还不打算在views下面给helloworld建一个完整的目录结构,所以我们暂时先使用index路由。在这个文件的最后添加:
exports.helloworld = function(req, res){
res.render('helloworld', { title: 'Hello, World!' });
它会负责处理这个URI请求,但是现在我们还没有一个实际的页面让res.render去render,这是Ejs负责的工作。进入你的views目录,打开index.ejs,把它另存为helloworld.ejs文件。现在它看上去应该是这样的:
&!DOCTYPE html&
&title&&%= title %&&/title&
&link rel=’stylesheet’ href=’/stylesheets/style.css’ /&
&h1&&%= title %&&/h1&
&p&Welcome to &%= title %&&/p&
应该很容易理解。
保存文件。在命令行窗口中按ctrl+c中断app.js,然后输入node app.js重新启动它。提示:当你修改一个ejs模板文件的时候,你不需要重启服务器。但是当你改了一个js文件的时候,比如app.js或者一个路由js文件,就必须要重启服务器才能看到效果了。
服务器启动后,注服务器打开http://localhost:3000/helloworld,应该能看到这个漂亮的界面了:
好了!现在我们有了路由可以处理我们的模板,看到了我们想要的效果。接下来我们来做一些Model(数据层)。
第3部分 – 创建数据库并读取数据
第1步 – 安装Mongodb
我们先关掉文本编辑器,回到命令行窗口。先用浏览器,打开http://mongodb.org/,下载Mongo。点击主菜单里的下载链接,找到适合你的系统的版本。对于64位win8,下载64-bit *2008R2+版本。下载后是个zip文件,解压到c:\mongo或者c:\program files\mongo或者随便什么地方,这不重要。我们把数据保存在我们的nodetest1目录里。
第2步 – 运行Mongod和mongo
在我们的nodetest1目录里创建一个子目录data,然后在命令行窗口中进入你的mongodb目录的bin目录里,输入:
mongod –dbpath c:\node\nodetest1\data
你会看到mongo服务器启动了,第一次启动需要一点时间,因为它需要预分配一些硬盘空间和一些其它的任务。当它提示”[initandlisten] waiting for connections on port 27017″的时候,就搞定了。没有什么别的需要做的了,服务器已经在运行了。现在你需要另外打开一个命令行窗口,进入mongo目录的bin目录中,输入
你会看到一些类似这种提示:
c:\mongo&mongo
MongoDB shell version: 2.4.5
connecting to: test
这时候如果你看一下mongod的窗口,你会看到提示一个连接已接入。我们接下来会使用这个命令行的客户端去手工处理一下我们的数据库,不过这对我们的Web站点并不是必须的。
第3步 – 创建一个数据库
不用担心上面的连接到test的提示。那只是当你没有指定数据库时mongo默认的一个数据库,它甚至不会创建这个名叫test的数据库,除非你增加一条记录进去。我们创建一个自己的数据库吧。在mongo的命令行窗口中,输入:
use nodetest1
除非我们插入一些数据进去,否则它也不会创建这个数据库。
第4步 – 添加一些数据
我最喜欢的MongoDB的特性就是它使用JSON作为数据结构,这就意味着我对此非常的熟悉。如果你不熟悉JSON,先去读点相关资料吧,这超出了本教程的范围。
我们添加一些数据到collection中。在这个教程里,我们只有一个简单的数据库,留侯 username和email两个字段。我们的数据看起来是这个样子的:
"_id" : 1234,
"username" : "cwbuecheler",
"email" : ""
你可以创建你自己的_id字段的值,不过我觉得最好还是让mongo来做这件事。它会为每一条记录创建一个唯一的值。我们看看它是怎么工作的。在mongo的窗口中,输入:
db.usercollection.insert({ “username” : “testuser1″, “email” : “” })
重要提示:db就是我们上面创建的nodetest1数据库,usercollection就是我们的collection,相当于一张数据表。注意我们不需要提前创建这个collection,它会在第一次使用的时候自动创建。好了,按下回车。如果一切顺利,你会看到……什么也没有。这可不太好,输入:
db.usercollection.find().pretty()
如果你好奇的话,pretty方法会格式化输出内容,添加换行缩进。它应该会显示:
"_id" : ObjectId("4d390cbf6eca"),
"username" : "testuser1",
"email" : ""
当然,你得到ObjectID应该是不一样的,mongo会自动生成一个。如果你以前使用过JSON接口的服务,现在是不是会觉得,哇,在web里调用这个应该很简单吧!嗯,你说对了。
提示:作为正式服务,你应该不希望所有的数据都存在最顶层。关于mongodb数据结构的设计,多看看Google吧。
现在我们有了一条数据,我们多添加点吧。在mongo窗口中输入:
newstuff = [{ “username” : “testuser2”, “email” : “” }, { “username” : “testuser3”, “email” : “” }]
db.usercollection.insert(newstuff);
注意,我们通过一个数据一次传递了多条数据到collection。多简单!再使用上面的find命令你会看到这三条数据。
现在我们来整合前面搭建的web服务器和数据库。
第5步 – 把mongo连接到node
现在我们来建立一个页面,把数据库里的记录显示成一个漂亮的表格。这是我们准备生成的HTML内容:
&li&&a href="mailto:"&testuser1&/a&&/li&
&li&&a href="mailto:"&testuser2&/a&&/li&
&li&&a href="mailto:"&testuser3&/a&&/li&
我知道这不太科学,不过你理解就好。我们只是为了建立一个简单的数据库读写程序,不是为了建立一个完整的网站。首先,我们往app.js(我们的程序的心脏和灵魂)里添加一点内容,这样才能接连上mongodb。打开c:\node\nodetest1\app.js,在顶部你会看到:
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
在它下面添加:
// New Code
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/nodetest1');
这几行会告诉app我们需要连接MongoDB,我们用Monk来负责这个连接,我们数据库位置是localhost:27017/nodetest1。注意27017是mongodb的默认端口,如果因为某些原因你修改了端口,记录这里也要跟着改。现在看文件的底部:
app.get('/', routes.index);
app.get('/users', user.list);
app.get('/helloworld', routes.helloworld);
下面添加一行:
app.get('/userlist', routes.userlist(db));
这一行告诉app当用户访问/userlist路径的时候,我们需要把db变量传递到userlist路由。但是我们现在还没有userlist路由,现在就去创建一个吧。
第6步 – 读取mongo中的数据并显示
用你的编辑器打开c:\node\nodetest1\routes\idnex.js,里面有index和hello world两个route,现在我们来添加第三个:
exports.userlist = function(db) {
return function(req, res) {
var collection = db.get('usercollection');
collection.find({},{},function(e,docs){
res.render('userlist', {
"userlist" : docs
好吧,事情变得有点复杂了。这里首先定义了一个function,接收我们传过来的db变量,然后调用一个跟前面两个route一样的page render。我们告诉它需要读取usercollection,做一个查找,返回的数据保存在docs变量中。一旦我们读取到了内容,就调用render来渲染userlist模板页面,把获取到的docs变量作为模板引擎中的userlist变量传递进去。
接下来建立我们的Ejs模板。在views目录下打开index.ejs,另存为userlist.ejs,然后把它的HTML修改成这样:
&!DOCTYPE html&
&title&USERLIST&/title&
&link rel=’stylesheet’ href=’/stylesheets/style.css’ /&
&h1&Userlist&/h1&
for(var i in userlist){
&li&&a href=”mailto:&%=userlist[i].email%&”&&%=userlist[i].username%&&/a&&/li&
保存文件,重启node服务器。希望你还记得怎么重启。打开浏览器,访问http://localhost:3000/userlist,你应该能看到这样的界面:
现在你从数据库里取到了数据并且显示到了网页上。太棒了。
另外还有一件极其重要的事情我想在这个教程里讲一下,你可以很容易的把userlist的view从一个Exress驱动的完整网页变成一个纯JSON文档。这样你就可以在其它客户端通过ajax方式来调用这个URL,比如使用jquery。自己研究一下吧,很简单的。
第4部分 – 终于到了:往数据库里写入数据
往数据库里写入数据也不是很困难。我们需要一个route来接收POST请求而不是GET。我们可以使用Ajax,这是我最常用的方式。不过那可能需要另外一篇教程了,所以这里我们还是用最原始的post手段。当然,要记住,如果你愿意,用ajax并不难。
第1步 – 建立你的数据输入页面
这里我们需要快一点:建立两个丑陋的不加样式的文本框和一个提交按钮。像上面一样,我们从app.get()开始。打开app.js找到app.get()的部分,在下面加上:
app.get('/newuser', routes.newuser);
然后打开routes/index.js在下面添加:
exports.newuser = function(req, res){
res.render('newuser', { title: 'Add New User' });
现在还需要一个模板,打开views/index.ejs另存为newuser.ejs,把内容替换成这样:
&!DOCTYPE html&
&title&Add User&/title&
&link rel=’stylesheet’ href=’/stylesheets/style.css’ /&
&h1&&%= title %&&/h1&
&form name=”adduser” method=”post” action=”/adduser”&
&input type=”text” placeholder=”username” name=”username” /&
&input type=”text” placeholder=”useremail” name=”useremail” /&
&input type=”submit” value=”submit” /&
这里我们创建一个form,method是post,action是adducer。简单明了。下面我们定义了两个输入框和一个提交按钮。如果这时候你重启node服务器,访问http://localhost:3000/newuser,你会看到这样的界面:
点提交按钮,你会看到一个“can’t post to /adduser”的错误。我们来修正它。
第2步 – 创建你的数据库处理函数
跟以前一样,我们修改app.js,然后是route文件,然后是ejs模板。不过,这里不需要ejs模板,因为我们post以后会跳转。在app.js的app.get()这一段的后面添加一行:
app.post('/adduser', routes.adduser(db));
注意这里是app.post,不是app.get了。来设置route吧。回到routes/index.js,创建我们的数据库插入函数。这个比较大,所以我建议你写好注释。
exports.adduser = function(db) {
return function(req, res) {
// Get our form values. These rely on the "name" attributes
var userName = req.body.
var userEmail = req.body.
// Set our collection
var collection = db.get('usercollection');
// Submit to the DB
collection.insert({
"username" : userName,
"email" : userEmail
}, function (err, doc) {
if (err) {
// If it failed, return error
res.send("There was a problem adding the information to the database.");
// If it worked, set the header so the address bar doesn't still say /adduser
res.location("userlist");
// And forward to success page
res.redirect("userlist");
显然在真正的项目里你还需要做很多验证,比如用户名和email不允许重复,email地址必须符合一定的格式规则。不过现在我们先不管这些。你可以看到,当插入数据库完成时,我们让用户跳转回userlist页面,他们应该在那里看到新插入的数据。
这是最好的方式吗?
第3步 – 连接数据库,写入数据
确保你的mongod在运行!然后重启你的node服务器。用浏览器打开http://localhost:3000/newuser。现在我们填入一些内容,点击提交按钮。如果顺利,我们应该回到了userlist页面,并且看到了刚刚添加的新数据。
现在我们正式的完成了使用Node.js,Exress,Ejs读取和写入Mongodb数据库,我们已经是牛X的程序员了。
恭喜你,真的。如果你认真的看完了这篇教程,并且很认真的学习而不只是复制代码,你应该对routes, views,读数据,写入数据有了完整的概念。这是你用来开发任何其它完整的Web网站所需要的一切知识点!不管你怎么想,我觉得这真挺酷的。
第5部分 – 下一步
现在开始,你拥有无限的可能。你可以看看, 另一个处理MongoDB数据库的Node包。它比Monk更大一些,功能也更丰富。你还可以看看Stylus,一个Express的CSS引擎。你可以Google一下Node Express Mongo Tutorial,看看接下来的内容。好好学习,天天向上。
我希望这篇教程能够有所帮助,我写这个是因为当我开始学习的时候我真的很需要这样的东西,但是又真的找不到。如果你已经看到了这里,非常感谢!
在学习的过程中,非常感谢下面这些大牛们提供的教程,幻灯片,视频,和tweets。
(), whose video presentation
got me interested enough to finally dig my thumbs into Node. She is a talented web developer, gives a fun talk, and also writes code for robots!
, whose article
helped me a ton with establishing a basic understanding of how all of these different pieces talk to each other.
, whose article
helped me pick up some important knowledge.
, whose article over at
was another good resource!
is an autodidact polymath, which is an incredibly pretentious way of saying that he’s a jack of all trades who didn’t like college. By day he’s a
for a small San Francisco startup. By night , with four books released. He also is an
and , and he brews beer on occasion. He follows the NBA avidly and the NFL casually (and sometimes glances at MLB). He lives in Providence, Rhode Island, with his awesome French wife and their two cats. He is trying to learn French but wishes he could just download it from the Matrix.
改自:http://www.unfish.net/archives/772-.html
转载请注明: &
本站暂时不开放评论!
工具猫微信平台
2016年五月
9101112131415
16171819202122
23242526272829

我要回帖

更多关于 nodejs访问mongodb 的文章

 

随机推荐