百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

MEAN实践——LAMP的新时代替代方案(下)

bigegpt 2025-01-29 14:27 6 浏览

在本系列文章的第一部分旨在介绍一些应用程序的基础技术细节和如何进行数据建模,而这个部分文章将着手建立验证应用程序行为的测试,并会指出如何启动和运行应用程序。

首先,编写测试

首先定义一些小型配置库。文件名:
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

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...