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

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

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

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

首先,编写测试

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

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...