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", pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy