diff --git a/lib/index.js b/lib/index.js index be18d9cbef..7303552b3a 100644 --- a/lib/index.js +++ b/lib/index.js @@ -98,4 +98,5 @@ if (config.connect.socket) { module.exports = { server: server, app: app, + cache: app.context.cache.client, }; diff --git a/lib/middleware/api-response-handler.js b/lib/middleware/api-response-handler.js index 536b3e94db..e43954750c 100644 --- a/lib/middleware/api-response-handler.js +++ b/lib/middleware/api-response-handler.js @@ -28,12 +28,7 @@ function responseHandler() { ctx.res.success = ({ statusCode, data = null, message = null }) => { const status = 0; - if (!!statusCode && statusCode < 400) { - ctx.status = statusCode; - } else if (!(ctx.status < 400)) { - ctx.status = statusCodes.OK; - } - + ctx.status = statusCode; ctx.body = { status, data, message }; }; diff --git a/lib/middleware/cache.js b/lib/middleware/cache.js index ffa0f4a5a0..874f86cd29 100644 --- a/lib/middleware/cache.js +++ b/lib/middleware/cache.js @@ -35,7 +35,7 @@ module.exports = function(app, options = {}) { app.context.cache = { get: async (key) => { - if (key) { + if (key && available) { let value = await redisClient.get(key); if (value) { await redisClient.expire(key, config.cache.contentExpire); @@ -45,6 +45,9 @@ module.exports = function(app, options = {}) { } }, set: async function(key, value, maxAge = config.cache.contentExpire) { + if (!available) { + return; + } if (await redisClient.exists(key)) { logger.warn(`repeated key: ${key}, ${value}`); return; @@ -59,9 +62,10 @@ module.exports = function(app, options = {}) { await redisClient.setex(key, maxAge, value); } }, + client: redisClient, }; globalCache.get = async (key) => { - if (key) { + if (key && available) { const value = await redisClient.get(key); return value; } @@ -81,7 +85,7 @@ module.exports = function(app, options = {}) { app.context.cache = { get: (key) => { - if (key) { + if (key && available) { let value = routeCache.get(key); if (value) { value = value + ''; @@ -96,13 +100,14 @@ module.exports = function(app, options = {}) { if (typeof value === 'object') { value = JSON.stringify(value); } - if (key) { + if (key && available) { return routeCache.set(key, value, maxAge * 1000); } }, + client: [pageCache, routeCache], }; globalCache.get = (key) => { - if (key) { + if (key && available) { return pageCache.get(key); } }; diff --git a/test/middleware/cache.js b/test/middleware/cache.js index 91dac88df5..da53eaa361 100644 --- a/test/middleware/cache.js +++ b/test/middleware/cache.js @@ -90,6 +90,47 @@ describe('cache', () => { expect(parsed4.items[0].content).toBe('Cache2'); }); + it('redis with quit', async () => { + process.env.CACHE_TYPE = 'redis'; + server = require('../../lib/index').server; + const client = require('../../lib/index').cache; + client.quit(); + const request = supertest(server); + + const response1 = await request.get('/test/cache'); + const parsed1 = await parser.parseString(response1.text); + + const response2 = await request.get('/test/cache'); + const parsed2 = await parser.parseString(response2.text); + + expect(response2.status).toBe(200); + expect(response2.headers).not.toHaveProperty('x-koa-redis-cache'); + expect(response2.headers).not.toHaveProperty('x-koa-memory-cache'); + + expect(parsed1.items[0].content).toBe('Cache1'); + expect(parsed2.items[0].content).toBe('Cache2'); + }); + + it('redis with error', async () => { + process.env.CACHE_TYPE = 'redis'; + process.env.REDIS_URL = 'redis://wrongpath:6379'; + server = require('../../lib/index').server; + const request = supertest(server); + + const response1 = await request.get('/test/cache'); + const parsed1 = await parser.parseString(response1.text); + + const response2 = await request.get('/test/cache'); + const parsed2 = await parser.parseString(response2.text); + + expect(response2.status).toBe(200); + expect(response2.headers).not.toHaveProperty('x-koa-redis-cache'); + expect(response2.headers).not.toHaveProperty('x-koa-memory-cache'); + + expect(parsed1.items[0].content).toBe('Cache1'); + expect(parsed2.items[0].content).toBe('Cache2'); + }); + it('no cache', async () => { process.env.CACHE_TYPE = ''; server = require('../../lib/index').server;