选择 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 环境
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 对象输出.