首页 » 未分类 » 正文

node.js学习二:数据库访问

选择http://yalishizhude.github.io/2015/11/02/mean-3/此文章作为参考学习对象

配置MongoDB数据库

mongodb上手简单,但如果数据库复杂等不建议使用mongodb,还是得用mysql之类的.
安装及环境变量就不说了,主要是配置服务:首先编辑mongodb.config文件

##store data here
dbpath=C:\Users\justchen\Desktop\node\mongodb\data
##all output go here
logpath=C:\Users\justchen\Desktop\node\mongodb\log\log.log

然后运行mongod.exe --config C:\Users\justchen\Desktop\node\mongodb\mongodb.config --install 注:路径自行修改,不要学我放桌面上 –install是表示注册windows服务的意思,不然每次要用的时候都得执行mongod.exe –config xxxx
创建数据库不介绍了,网上大把.另外GUI的数据库操作:http://robomongo.org. chrome 也有个 jsonview插件.这个在以后用得上.

初始化node.js的express环境

很多教程使用的是jade做为渲染模块.但这货真的不适合初学者,我在此坑里呆了两天才爬出来,看到ejs才弄明白是怎么回事,所以这篇文章也是ejs做为渲染模块.

cnpm express myweb -e 创建example环境. 这里的-e表示使用ejs来做渲染.

修改 package.json 以增加相应的依赖

`cnpm install serialport monk morgan –save’ serialport是串口相关,实际上此项目里用不上,另外两个是mongodb相关.

通过Express创建1个API

引用自 http://yalishizhude.github.io/2015/11/02/mean-3/ 写得非常详细,在这里只做备份记录.

在这个步骤中,你将学习到关于Node模块系统,Express路由和用Monk从MongoDB中获取数据。
用你最喜欢的代码编辑器在项目根目录中打开app.js。文件中第1部分包含了几个 require函数调用。 require方法是Node中内置方法之一,主要用来引用其它文件中定义的模块:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

第2部分引入了我们的路由模块。1个路由模块定义了1个或多个关联的端点以及对应的处理器。在这个由Express Generator生成的示例应用中,我们有两个路由模块: index 和 users:
var routes = require('./routes/index');
var users = require('./routes/users');
让我们看一看其中的一个路由模块,打开 rutes>index.js。你将看到以下代码:

var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
 res.render('index', { title: 'Express' });
});
module.exports = router;

来分析一下这段代码。
在第1行,我们在当前模块引用了Express。当使用 require方法时,依赖于目标模块是怎样实现的, require方法可能返回1个方法或者对象。在这个例子中,这个 express变量是1个对象。它提供了一个叫做 Router的方法,我们在第2行就调用了这个方法。用来访问Express中的路由对象。我们用1个路由来定义我们应用中的端点。我们在这些端点中接收请求。每个端点将会被关联到1个路由处理器,处理器负责处理在端点中收到的请求。
现在看下一行中路由配置的示例。

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

我们使用路由中定义的 get方法来定义1个路由和它的处理器。第1个参数是这个端点;在这里,/代表网站的根路径或者主页。第2个参数就是路由的处理器。

在Express中,所有的路由处理器都有一个同样的签名。第1个参数是请求对象,第2个参数是响应对象,第3个参数是当前链中的下一个处理器。Express使用的中间件函数采用链式调用的方式。当Express使用中间件时,有时候你可能需要在当前链中调用下一个中间件。你可以通过 next 变量实现。但是当我们在处理路由的时候,我们几乎不需要这个操作,所以这里你可以安全地删除 next 变量。
现在看一下这个函数体。 res 变量代表了响应对象。这个响应对象自带了一些有用的函数。
– render:用来渲染视图
– send:用来发送文本内容到客户端
– json:发送json对象到客户端
– redirect:重定向客户端到另一个地址
在这里,我们渲染index视图,这个视图在 views>index.jade中已经定义了。
这就是一个路由的基础结构。我们现在需要为我们的视频创建一个RESTful API。我们将在1个类似 /api/videos的端点中展示我们的视频。
在 routes 目录下创建1个新的路由模块叫做 videos.js ,然后在文件输入以下代码,之后我会对这段代码进行逐行讲解。

var express = require('express');
var router = express.Router();
var monk = require('monk');
var db = monk('localhost:27017/vidzy');

router.get('/', function(req, res) {
    var collection = db.get('videos');
    collection.find({}, function(err, videos){
        if (err) throw err;
        res.json(videos);
    });
});
module.exports = router;

头两行和之前的一样,我们引入了Express然后获取路由对象。
然后我们引入了Monk,一个用来持久化MongoDB数据的模块。另一个叫做 Mongoose 的模块也可以达到这个效果。但是在本教程中,我更倾向用Monk。
之前曾经提过, require 方法会根据模块的实现方式来返回一个对象或者方法。当我们引入Monk的时候得到的是一个方法而不是对象。所以 monk 变量是一个我们通过调用来访问数据库的方法。
var db = monk('localhost:27017/vidzy');
现在来实现我们路由处理器的逻辑。

function(req, res) {
    var collection = db.get('videos');
    collection.find({}, function(err, videos){
        if (err) throw err;
        res.json(videos);
    });
}

首先我们调用 db 对象的 get 方法,传入集合的名称(video)。它将返回一个集合对象。这个集合对象提供了一个数字和一些方法来操作集合上的文档。

方法 说明 示例
inser 插入数据 products.insert({“name”:”orange juice”,”description”:”just so so”})
find 查找数据 products.find({“name”:”apple juice”}, function(err, docs) {console.log(docs)})
findOne 查找数据 users.findOne({name: ‘foo’}).then((doc) => {})
update 修改现有条目 users.update({name: ‘foo’}, {name: ‘bar’})
remove 删除文档 users.remove({ woot: ‘foo’ })

monk 详细用法:https://automattic.github.io/monk/index.html
这里我们使用find方法来获取集合中的所有视频。这个方法的第1个参数是一个用来过滤的对象。由于我们需要查询所有视频,我们传入一个空对象。第2个参数是一个回调方法,从数据库返回结果之后调用。这个方法遵循Node回调函数的标准协议模式——“错误优先”。在这个模式中,回调函数的第1个参数是一个错误对象,第2个参数才是返回结果。当你开发更多的Node应用的时候,你将发现更多的这种回调模式。
在这种回调中,我们首先检查 err 对象是否被设置。如果在查询视频文档中没有出现错误, err 的值是 null;否则它将被设置。我们抛出 err 来中断程序的执行并且告知用户。如果没有错误,就通过调用 res.json 简单地返回一个JSON对象。
看最后一行 module.exports = router;
这一行定义了一个对象返回值,当别的模块引用这个模块时我们将返回这个对象。在这种情况下我们返回路由对象给Express。这个模块的主要功能就是获取路由并注册一些路由配置并返回。
然后添加路由测试一下我们的API。打开浏览器输入地址 http://localhost:3000/api/videos 。你将看到JSON对象输出.

网页输出

发表评论