如何在我的nodejs API REST中实现redis?

问题描述 投票:0回答:1

我正在尝试将 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客户端?

node.js express redis
1个回答
0
投票

怎么样,这应该可以解决它:

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);
    }
  });
© www.soinside.com 2019 - 2024. All rights reserved.