在本系列文章的第一部分旨在介绍一些应用程序的基础技术细节和如何进行数据建模,而这个部分文章将着手建立验证应用程序行为的测试,并会指出如何启动和运行应用程序。
首先,编写测试
首先定义一些小型配置库。文件名:
test/config/test_config.js
服务器运行端口是localhost 8000,对于初始的测试来说非常适合。之后,如果改变产品系统的位置或者端口号,只需要简单地修改这个文件就可以。为了良好地测试,首先应该建立1个好的测试环境,这点可以通过下面的代码保证。首先,连接到数据库。
文件名:est/setup_tests.js。
下一步,drop user collection,这么做可以了解数据库状态。
下一步,drop user feed entry collection。
下一步,连接到Stormpath,随后删点所有测试应用程序中的用户。
下一步,关闭数据库。
最终,调用async.series来保证所有函数都按次序运行。
Frisby在初期就被建立,这里将使用它定义测试用例,如下:
文件名:
test/createaccountserror_spec.js
下面代码将从enroll route开始。这个用例故意丢掉了first name字段,因此获得1个400与1个JSON error(显示first name未定义)返回,下面就toss that frisby:
下面用例将测试不包含小写字母,这同样会导致Stormpath返回错误,以及返回400状态。
下面将测试一个无效邮箱地址。因此,期望返回的是未发现@标志,以及emali地址缺少域名,同时也会获得1个400状态。
文件名:
test/createaccountsspec.js
下面着眼一些可以运行的例子,首先需要定义3个用户。
文件名:
test/createaccountsspec.js
下面用例将发送1个包含上文已定义3个用户的数组,当然期望获得代表成功的201状态。返回的JSON document将展示已建立的用户对象,因此这里可以检查测试数据匹配与否。
下一步将测试重复用户。下例将验证这个用户注册的email地址已经被使用。
这里存在一个重要问题,无法知道Stormpath会优先返回哪个API key。因此,这里需要建立一个动态文件。随后可以使用这个对文件来验证测试用例——用户身份验证组件。
文件名称: /tmp/readerTestCreds.js
为了建立上面这个临时文件,这里需要连接MongoDB从而检索用户信息。代码如下:
文件名:tests/writeCreds.js
着眼下面代码,上文建立的临时文件在第一行就会被使用。同时,有多个feeds被建立,比如Dilbert 和the Eater Blog。
文件名:tests/feed_spec.js
首先,一些用户会被建立,当然他们并没有订阅任何feeds。下面代码将测试feeds的订阅。请注意,这里同样需要进行身份验证,通过使用.auth 和Stormpath API keys完成。
下面用例将为第一个测试用户订阅Dilbert feed。
这个用例将尝试为用户feed重复订阅。
下一步,将为测试用户添加一个新的feed,返回的结果应该是用户当下已经订阅了2个feed。
下一步,将使用第2个测试用户来订阅1个feed。
REST API
在开始编写REST API代码之前,首先需要定义一些实用工具库。首先,需求定义应用程序如何连接到数据库。将这个信息写入一个独立的文件允许应用程序灵活地添加新数据库URL,以应对开发或者生产系统。
文件名:config/db.js
如果期望打开数据库验证,这里需要将信息存入1个文件,如下文代码所示。出于多个原因,这个文件不应该被置入源代码控制。
文件名称:config/security.jsaaaa
module.exports = { stormpath_secret_key : ‘YOUR STORMPATH APPLICATION KEY’; }
Stormpath API和Secret keys应该被保存到属性文件,如下文代码所示,同事还需要严加注意。
文件名:
config/stormpath_apikey.properties
apiKey.id = YOUR STORMPATH API KEY ID apiKey.secret = YOUR STORMPATH API KEY SECRET
Express.js 简述
在Express.js中会建立应用程序(APP)。这个应用程序会监听制定的端口来响应HTTP请求。当请求涌入,它们会被传输到1个中间件链。中间件链中的每个link 都会被给予1个请求和1个响应对象用以存储结果。link 分为两种类型,工作或者传递到下一个link 。这里会通过app.use来添加新的中间件。主中间件被称为“router(路由器)”,它会监听URL,并将URL/动作传递到1个指定的处理函数。
建立应用程序
现在开始聚焦应用程序代码,鉴于可以在独立文件中为不同的routes嵌入处理器,所以应用程序的体积非常小。
文件名:server.js
在chain中末尾定义中间件来处理坏URLs。
现在,应用程序就会监听8000端口。
在控制台将消息打印给用户。
console.log('Magic happens on port ' + port); exports = module.exports = app;
定义Mongoose数据模型
这里会使用Mongoose将Node.js上的对象映射成MongoDB文档。如上文所述,这里将建立4个collections:
Feed collection。
Feed entry collection。
User collection。
User feed-entry-mapping collection。
下一步,将为4个collections定义schema。首先,从user schema开始。注意,这里同样可以格式化数据,比如讲字母都转换成小写,使用trim消除首/末空格。
文件名:app/routes.js
下面代码将告诉Mongoose需要哪些索引。当索引不存在于MongoDB数据库中时,Mongoose将会负责索引的建立。唯一性约束保障将去除重复出现的可能。“email : 1” 将以升序的方式维护地址,而“email : -1”则是降序。
在其他3个collections上重复这个步骤。
下面是复合索引实例,每个索引都以升序维护。
userFeedEntrySchema.index({userID : 1, feedID : 1, feedEntryID : 1, read : 1}); var UserFeedEntryModel = mongoose.model('UserFeedEntry', userFeedEntrySchema );
每个用于GET、POST、PUT和DELETE的请求需要拥有1个正确的内容类型,也就是application/json。然后下一个link 会被调用。
下一步需要为每个URL/verb定义处理器。参考资料部分附上了所有代码,下面只是代码片段。在这些代码中,Stormpath带来的便捷一览无余。此外,这里定义的是/api/v1.0,举个例子,这里客户端可以调用的是/api/v1.0/user/enroll。如果使用/api/v2.0,/api/v2.0则可以被使用,当然向下兼容。
启动服务器并运行测试
要启动服务器和运行测试,这里需要遵循几个步骤。
1.保证MongoDB实例运行,mongod。
2. 安装Node库,npm install。
3. 开启REST API服务器,node server.js。
4.运行测试用例:node setup_tests.js;jasmine-node
create_accounts_error_spec.js;jasmine-node create_accounts_spec.js;node write_creds.js;jasmine-node feed_spec.js。
原文链接:Building your first application with MongoDB: Creating a REST API using the MEAN Stack - Part 2 (翻译/OneAPM工程师 责编/仲浩)
参考文献:
HTTP status code definitions
Chad Tindel’s Github Repository
M101JS: MongoDB for Node.js Developers
Data Models
Data Modeling Considerations for MongoDB Applications