我正在尝试将 redis 实现到我的 api 堆栈中以提高性能。我想实现它来缓存我的 API REST 中的配置文件列表,但由于我是 Redis 新手,我遇到了一些问题。
这是我的server.js
const express = require('express');
const cors = require('cors');
const sequelize = require('./config/db');
const dotenv = require('dotenv');
const cookieParser = require('cookie-parser');
//Route files
const auth = require('./routes/api/auth');
const users = require('./routes/api/users');
const profiles = require('./routes/api/profiles');
const app = express();
app.use(cors());
sequelize.authenticate()
.then(() => {
console.log('Conexión a la base de datos establecida exitosamente.');
})
.catch(err => {
console.error('No se pudo conectar a la base de datos:', err);
});
//Body parser
app.use(express.json({ extended:false }));
//Cookie parser
app.use(cookieParser());
//Define routes
app.use('/api/users', users);
app.use('/api/auth', auth);
app.use('/api/profiles', profiles);
sequelize.sync()
.then(() => console.log('Tables Synced'))
.catch(error => console.error('Error while syncronizing table:', error));
app.get('/', (req, res) => res.send('API Running'));
//Load env vars
dotenv.config({path: './config/config.env'});
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
这是我的控制器/profile.js
const asyncHandler = require('../middleware/async');
const Profile = require('../models/Profile.model');
const ErrorResponse = require('../utils/errorResponse');
const redis = require('redis');
const redisClient = redis.createClient({
host: 'localhost',
port: 6379,
});
redisClient.on('error', (err) => {
console.log('Redis Client Error', err);
});
redisClient.on('ready', () => {
console.log('Redis is ready');
});
//@desc Get all Profiles
//@route GET /api/profile
//@access Public
exports.getProfiles = asyncHandler(async (req, res, next) => {
const cacheKey = 'profiles';
const cachedProfiles = await redisClient.get(cacheKey);
if (cachedProfiles) {
return res.status(200).json(JSON.parse(cachedProfiles));
} else {
const profiles = await Profile.findAll();
redisClient.setex(cacheKey, 300, JSON.stringify(profiles));
return res.status(200).json(profiles);
}
});
这是我的routes/profiles.js
const express = require('express');
const router = express.Router();
const { protect } = require('../../middleware/auth');
const {
createProfile,
getProfiles,
getProfile,
getProfileMe,
deleteProfile
} = require('../../controllers/profiles');
router.post('/', protect, createProfile);
router.get('/', getProfiles);
router.get('/me', protect, getProfileMe);
router.get('/:user_id', getProfile);
router.delete('/', protect, deleteProfile);
module.exports = router;
有人可以告诉我在这种情况下redis的正确实现吗? 我正在向
GET
发送 http://localhost:5000/api/profiles
请求,但收到错误 The client is closed
此外,最佳实践是什么?我应该在哪里创建redis客户端?
怎么样,这应该可以解决它:
exports.getProfiles = asyncHandler(async (req, res, next) => {
const redisClient = redis.createClient({
host: 'localhost',
port: 6379,
});
const cacheKey = 'profiles';
const cachedProfiles = await redisClient.get(cacheKey);
if (cachedProfiles) {
return res.status(200).json(JSON.parse(cachedProfiles));
} else {
const profiles = await Profile.findAll();
redisClient.setex(cacheKey, 300, JSON.stringify(profiles));
return res.status(200).json(profiles);
}
});