开发中为了快速交互数据库,于是需要一个能便捷搭建api的平台。于是学习了一下sails.js框架。本次实践是一次摸索,使用了winston日志记录,supertest单元测试,mongo数据库,hashids哈希值解密。

模块: winston+supertest+mongo+hashids

一、准备工作

我为了方便,使用docker拉取了一个mongodb的容器,在其中新建了my_widget_db数据库以及一个jobdetails集合。

jobdetails中数据样例属性如下:

jobId: 300***42
postingId: 1888***19
hash: JKMNlw*********5Pt7VQA
jonName: jobname1

安装日志模块以及加解密模块:

npm install winston
npm install hasids

模块需要配置一下 ,在config/bootstrap.js文件中:

const winston = require("winston");
const Hashids = require("hashids");
module.exports.bootstrap = async function() {const logConfiguration = {'transports': [new winston.transports.Console()]};sails.logger = winston.createLogger(logConfiguration);sails.hashids = new Hashids("JrY1ofkGxnByuIcFh0mHmIF6ieJLkwpM");
};

二、Sails.js用法

Sails.js是MVC架构的一个api搭建框架,创建一个项目:

sails new project-name

创建api命令,会生成一个controller文件和model文件(/api下的controller和model内):

sails generate api ApiName

在app/api/controller/ApiNameController.js中实现响应请求的代码。

比如请求获取jobdetails数据:

const responseError = (res, message, code = 400) => {res.status(code)res.send({message})return res
}const keys = ['jobId', 'postingId', 'hash', 'jobName']// 检查数据完整性
const checkData = (data) => {let status = truekeys.forEach(key => {if (!data[key]) {status = false}})return status
}// 检查非空参数数量
const checkParameters = (data) => {let c = 0;keys.forEach((key) => {if (data.param(key)) {// console.log(data.param(key))c++;}})return c;
}module.exports = {// 实现响应函数 getDetails,用于查询数据库中的数据async getJobDetails(req, res) {try {// check the number of paramslet counter = checkParameters(req)// console.log('params: ', `${counter}`)if (counter < 1) {return res.serverError('At least one parameter must be provided!');}let queryObject = {}keys.forEach(key =>{if (req.param(key)) {queryObject[key] = req.param(key)}})// JobDetails是我的model名称var getRecord = await JobDetails.find(queryObject).sort('createdAt DESC').limit(1);if (!getRecord && getRecord !== "undefined") {sails.logger.log('error', `jobId(${jobId}) not found`);return res.notFound();} else {getRecord.map(value =>{if (value.hash) {value.hash = sails.hashids.decode(value.hash);}if (value.createdAt) {delete value.createdAt;}if (value.updatedAt) {delete value.updatedAt;}if (value.id){delete value.id}return value})return res.json({data: getRecord});}} catch (err) {sails.logger.log('error', JSON.stringify(err));return res.serverError(err);}},
}

配置一下model/api.js文件

module.exports = {attributes: {jobId: {type: 'string'},postingId: {type: 'string'},hash: {type: 'string'},jobName: {type: 'string'},},};

接着设定网络请求的映射路由,将请求地址映射为此action响应函数 ,其中关于路由写法:

/jobdetails/:jobId?:postingId?:hash?:jobName?

表示/jobdetails/地址接收可选的参数有四个,分别是jobId,postingId,hash,jobName

module.exports.routes = {"GET /jobdetails/:jobId?:postingId?:hash?:jobName?": {controller: "JobDetailsController",action: "getJobDetails",cors: {origin: "http://127.0.0.1:3333, http://localhost:3333",credentials: false}// swagger: {},},
}

最后还需要配置一下数据库请求地址,我这里是docker容器,映射地址是

localhost:27018

因此进行如下设置,一般mongodb默认的地址是localhost:27017,为了避免冲突我重映射为了27018端口。

在/config/datastores.js文件中添加:

module.exports.datastores = {mongodbServer: {adapter: 'sails-mongo',url: 'mongodb://localhost:27018/my_widget_db',},
};

三、接口测试

安装supertest模块,并在项目根目录下新建一个test文件夹:

npm install supertest

创建文件:/test/integration/controllers/ApiName.test.js


var supertest = require('supertest');
var sails = require('sails');
var assert = require('assert')describe('JobDetailsController', function () {[{'jobId':'300***42 '}].forEach( job =>{it(`getJobDetails ${job['jobID']}`, function (done) {let query = ''for(let k in job){query += '?' + kquery += '=' + job[k]}supertest(sails.hooks.http.app).get(`/jobdetails/${query}`).expect("Content-Type", /json/).expect(200).end(function (err, res) {if(res && res._body && res._body.data && res._body.data.length){return done()}else{return assert.ok(false,'There is no matching data in the database');}})})let data = []if(job['jobID']==='300***42 '){data = [{op:'add',path:'jobName',value:'jobnamehaschanged'}]}it(`patchJobDetails ${job['jobID']}`,function(done){supertest(sails.hooks.http.app).patch(`/jobdetails/${job['jobID']}`,data).expect("Content-Type", /json/).expect(200).end(function(err,res){if(res && res._body && res._body.length){return done()}else{return assert.ok(false,'There is no matching data in the database');//done(false)//done(new Error('There is no matching data in the database'))}})})})});

测试api:

npm run test

Postman 上测试:

Sails.js自动化Api实践与测试相关推荐

  1. 十个书写Node.js REST API的最佳实践(上)

    收录待用,修改转载已取得腾讯云授权 原文:10 Best Practices for Writing Node.js REST APIs 我们会通过本文介绍下书写Node.js REST API的最佳 ...

  2. 您应该遵循的15个UI测试自动化最佳实践(上)

    本文转载自晨小菜订阅号,感谢大佬的分享 我们知道,在过去二十年UI端的自动化测试一直是我们项目上做自动化测试的重点.随着敏捷的发展,慢慢的越来越多人开始诟病UI自动化测试,觉得在UI端做自动化其稳定性 ...

  3. 陆金所测试专家金玲谈《基于容器的自动化环境管理实践》

    金玲:大家下午好,我是来自陆金所测试部金玲,大家知道陆金所是做什么的吗?请举手示意一下.有在陆金所投资过的举手示意一下?陆金所是针对用户的个人投资理财平台,开始的时候是针对P2P起家,后来整个业务进行 ...

  4. api自动化测试_API测试和自动化101:基本指南

    api自动化测试 API代表A pplication P AGC软件我覆盖整个院落. 通常,API用于通过使用任何通信方式来促进两个不同应用程序之间的交互. 在网络上使用API​​时,我们将其称为&q ...

  5. Jenkins + Postman + Newman作自动化API测试

    文章目录 Jenkins + Postman + Newman作自动化API测试 用Postman作API测试 提交Postman Collection到版本控制 在Jenkins上安装`newman ...

  6. vue each_Vue 应用单元测试的策略与实践 05 - 测试奖杯策略

    本文首发于 Vue 应用单元测试的策略与实践 05 - 测试奖杯策略 | 吕立青的博客 欢迎关注知乎专栏 -- 前端的逆袭(凡可 JavaScript,终将 JavaScript.) 欢迎关注我的博客 ...

  7. 老web换新枝----Sails.js移动设备的全新生产力(五)

    自定义模型操作 目前为止,我们的进展非常顺利,我们使用了 Sails 的默认路由来访问或修改模型实例.这些默认设置(包含在 Sails Blueprint API 中)负责我们期望从 Web 或移动应 ...

  8. 如何使用 TensorFlow.js 自动化 Chrome 恐龙游戏?

    本文为 AI 研习社编译的技术博客,原标题 : Using TensorFlow.js to Automate the Chrome Dinosaur Game (part 1) 作者 | Aayus ...

  9. 基于 Docker 和 GitLab 的前端自动化部署实践笔记

    基于 Docker 和 GitLab 的前端自动化部署 实践笔记 随着接触的项目越来越多,在部署测试流程上重复耗时工作也越来越多,所以对前端工作的CI/CD实现愈发迫在眉睫. 前端开发由于三大框架的崛 ...

  10. 安装 Windows 自动化 API 3.0 后,Visual Studio 2010 的运行速度更快

    安装 Windows 自动化 API 3.0 后,Visual Studio 2010 的运行速度更快 本文适用于以下产品: Microsoft Visual Studio 2010 如果未安装 Wi ...

最新文章

  1. <笔记1>matplotlib绘图工具笔记
  2. golang switch case语句 简介
  3. 初识标准库vector
  4. jQuery中的动画理论干货
  5. HOWTO: Create and submit your first Linux kernel patch using GIT
  6. Asp.net网站的ClickOnce自动部署(3)-虚拟目录的配置
  7. bzoj5194: [Usaco2018 Feb]Snow Boots
  8. Python A*算法的简单实现
  9. pdf文件太大怎么压缩?四个步骤完成
  10. css3 简单的动画实现欢乐愉快的小鱼
  11. 【案例】10个视觉系优秀网页设计让你打破灵感的僵局
  12. 努比亚Z11系统服务器选择,又有新系统刷!努比亚Z11适配ZUI 2.5系统!
  13. oracle wallet java_使用Oracle客户端wallet实现匿名登录
  14. 河北大学计算机类信息安全专业就业前景,2018信息安全专业就业前景和就业方向分析...
  15. vb mysql 转义字符,MySQL_在VB.NET应用中使用MySQL的方法, 绪言 在Visual Studio中使用 - phpStudy...
  16. vsync, hsync, VBLANK
  17. JDBC(数据库和Java)
  18. 牛客算法竞赛入门笔记2
  19. Hadoop科普文——常见的45个问题解答
  20. SAP CRM 的解决方案-销售

热门文章

  1. SpringBoot基础学习之整合Swagger框架(下篇)
  2. linux做gpt分区,Linux下的GPT分区
  3. jsoup爬虫发送get、post请求、解析html、获取json
  4. Errors were encountered while processing
  5. java 调用gephi_Gephi可视化(一)——使用Gephi Toolkit创建Gephi应用
  6. QNX Hypervisor —— 体系结构
  7. Object.defineProperty是Es5中无法shim的特性 shim是什么?
  8. TP99 TP999
  9. 最完整的Android 安卓开发体系了解一下
  10. BurpSuite之Intruder模块(暴力破解)