From e99356e60c22a6a49e87980988698a926381b4d8 Mon Sep 17 00:00:00 2001 From: jysperm Date: Wed, 9 Dec 2020 17:23:38 +0800 Subject: [PATCH 1/2] :tada: Stateful Tester --- app.js | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 23 ++++++++++ server.js | 26 ++++++++++++ 3 files changed, 166 insertions(+) create mode 100644 app.js create mode 100644 package.json create mode 100644 server.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..98f11c3 --- /dev/null +++ b/app.js @@ -0,0 +1,117 @@ +const AV = require('leanengine') +const Redis = require('ioredis') +const assert = require('assert') +const marked = require('marked') +const _ = require('lodash') +const mysql = require('mysql') +const express = require('express') +const Promise = require('bluebird') + +const app = express() + +app.use(AV.express()) + +app.get('/', async (req, res, next) => { + try { + let result = '# Stateful Tester\n' + + result += await getRedisInfos() + result += await getMysqlInfos() + + res.send(marked(result)) + } catch (err) { + next(err) + } +}) + +app.use(function(err, req, res, _next) { + var statusCode = err.status || 500 + + if (statusCode === 500) { + console.error(err.stack || err) + } + + res.status(statusCode) + res.json({ + error: err.message + }) +}) + +async function getRedisInfos() { + let result = '' + + const redisKeys = _.filter(_.keys(process.env), name => { + return name.startsWith('REDIS_URL_') + }) + + for (const redisKey of redisKeys) { + const redisString = process.env[redisKey] + + console.log('connecting to Redis', redisKey, redisString) + + result += `## ${redisKey.slice('REDIS_URL_'.length)}\n` + + let redisClient + + try { + redisClient = new Redis(redisString) + const randomString = new Date().toString() + + await redisClient.info() + await redisClient.set('stateful-tester', randomString) + assert.strictEqual(await redisClient.get('stateful-tester'), randomString) + + result += `OK\n` + } catch (err) { + result += `\`${err.message}\`\n` + } finally { + redisClient.quit() + } + } + + return result +} + +async function getMysqlInfos() { + let result = '' + + const mysqlKeys = _.filter(_.keys(process.env), name => { + return name.startsWith('MYSQL_HOST_') + }) + + for (const mysqlKey of mysqlKeys) { + const mysqlName = mysqlKey.slice('MYSQL_HOST_'.length) + + const mysqlOptions = { + host: process.env[`MYSQL_HOST_${mysqlName}`], + port: process.env[`MYSQL_PORT_${mysqlName}`], + user: process.env[`MYSQL_ADMIN_USER_${mysqlName}`], + password: process.env[`MYSQL_ADMIN_PASSWORD_${mysqlName}`], + database: 'test', + } + + console.log('connecting to MySQL', mysqlName, JSON.stringify(mysqlOptions)) + + result += `## ${mysqlName}\n` + + let mysqlPool + + try { + mysqlPool = Promise.promisifyAll(mysql.createPool(mysqlOptions)) + + const rows = await mysqlPool.queryAsync('SELECT 1 + 1 AS solution') + + assert.strictEqual(rows[0].solution, 2) + + result += `OK\n` + } catch (err) { + result += `\`${err.message}\`\n` + } finally { + mysqlPool.end() + } + } + + return result +} + +module.exports = app diff --git a/package.json b/package.json new file mode 100644 index 0000000..989381a --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "stateful-tester", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "bluebird": "^3.7.2", + "express": "^4.17.1", + "ioredis": "^4.17.3", + "leancloud-storage": "^4.6.1", + "leanengine": "^3.7.0", + "lodash": "^4.17.19", + "marked": "^1.1.1", + "mongodb": "^3.6.0", + "mysql": "^2.18.1", + "safe-regex": "^2.1.1" + }, + "engines": { + "node": "10.x" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..335d15a --- /dev/null +++ b/server.js @@ -0,0 +1,26 @@ +const AV = require('leanengine') + +AV.init({ + appId: process.env.LEANCLOUD_APP_ID, + appKey: process.env.LEANCLOUD_APP_KEY, + masterKey: process.env.LEANCLOUD_APP_MASTER_KEY +}) + +const app = require('./app') + +// 端口一定要从环境变量 `LEANCLOUD_APP_PORT` 中获取。 +// LeanEngine 运行时会分配端口并赋值到该变量。 +const PORT = parseInt(process.env.LEANCLOUD_APP_PORT || process.env.PORT || 3000) + +app.listen(PORT, function (err) { + console.log('Node app is running on port:', PORT) + + // 注册全局未捕获异常处理器 + process.on('uncaughtException', function(err) { + console.error('Caught exception:', err.stack) + }) + + process.on('unhandledRejection', function(reason, p) { + console.error('Unhandled Rejection at: Promise ', p, ' reason: ', reason.stack) + }) +}) From ae66165ca29be4694af8a517a395f57280383ddb Mon Sep 17 00:00:00 2001 From: jysperm Date: Mon, 19 Jul 2021 17:03:48 +0800 Subject: [PATCH 2/2] :sparkles: Add mongo support --- app.js | 34 ++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 98f11c3..f8b9bb2 100644 --- a/app.js +++ b/app.js @@ -6,6 +6,7 @@ const _ = require('lodash') const mysql = require('mysql') const express = require('express') const Promise = require('bluebird') +const {MongoClient} = require('mongodb') const app = express() @@ -17,6 +18,7 @@ app.get('/', async (req, res, next) => { result += await getRedisInfos() result += await getMysqlInfos() + result += await getMongoInfos() res.send(marked(result)) } catch (err) { @@ -114,4 +116,36 @@ async function getMysqlInfos() { return result } +async function getMongoInfos() { + let result = '' + + const mongoKeys = _.filter(_.keys(process.env), name => { + return name.startsWith('MONGODB_URL_') + }) + + for (const mongoKey of mongoKeys) { + const mongoString = process.env[mongoKey] + + console.log('connecting to MongoDB', mongoKey, mongoString) + + result += `## ${mongoKey.slice('MONGODB_URL_'.length)}\n` + + const mongoClient = new MongoClient(mongoString, {useUnifiedTopology: true}) + + try { + await mongoClient.connect() + + await mongoClient.db('test').command({dbStats: 1}) + + result += `OK\n` + } catch (err) { + result += `\`${err.message}\`\n` + } finally { + mongoClient.close() + } + } + + return result +} + module.exports = app diff --git a/package.json b/package.json index 989381a..0956c37 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dependencies": { "bluebird": "^3.7.2", "express": "^4.17.1", - "ioredis": "^4.17.3", + "ioredis": "^4.24.6", "leancloud-storage": "^4.6.1", "leanengine": "^3.7.0", "lodash": "^4.17.19",