无法连接到azure redis服务

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

我在 azure 中部署了一个 web 应用程序,并且还配置了 azure redis 缓存,但我无法使我的缓存工作。我的 nextjs 前端应用程序托管在 vercel 中。

这是我的 Nodejs 应用程序中的 Redis 客户端:

const redis = require("redis");
const dotenv = require('dotenv');

dotenv.config({ path: './.env' });

// Variables de entorno para la caché
const cacheHostName = process.env.AZURE_CACHE_FOR_REDIS_HOST_NAME;
const cachePassword = process.env.AZURE_CACHE_FOR_REDIS_ACCESS_KEY;

if (!cacheHostName) throw new Error("AZURE_CACHE_FOR_REDIS_HOST_NAME is empty");
if (!cachePassword) throw new Error("AZURE_CACHE_FOR_REDIS_ACCESS_KEY is empty");

exports.connect = async () => {
  let client;

  if (process.env.NODE_ENV === 'production') {
    client = redis.createClient({
      // Configuración de Redis para TLS en producción
      url: `redis://${cachePassword}@${cacheHostName}:6380`,
      tls: {
        rejectUnauthorized: true // Asegúrate de que este valor sea verdadero para requerir SSL
      }
    });
  } else {
    // Configuración local de Redis para pruebas
    client = redis.createClient({
      host: 'localhost',
      port: 6379
    });
  }

  client.on('connect', () => {
    console.log('Cliente Redis conectado al servidor');
  });

  client.on('error', (err) => {
    console.error('El cliente Redis no pudo conectarse al servidor:', err);
  });

  client.on('end', () => {
    console.log('La conexión del cliente Redis se cerró');
  });

  await client.connect();

  return client;
};

我的redis服务中的SSL端口被禁用,我的SSL端口是6380,TLS版本是1.2

每次我通过邮递员或通过我的托管应用程序发出请求时,该请求都会保持无限

Sending request...

我也尝试过

rejectUnauthorized: false
,但没有显示任何变化。

我的 Redis 客户端似乎正在无限循环中连接并失败:

Cliente Redis connected to the server
The Redis Client was not able to connect to the server: Error: read ECONNRESET
    at TCP.onStreamRead (node:internal/stream_base_commons:218:20) {
  errno: -4077,
  code: 'ECONNRESET',
  syscall: 'read'
}
El cliente Redis no pudo conectarse al servidor: Error: read ECONNRESET
    at TCP.onStreamRead (node:internal/stream_base_commons:218:20) {
  errno: -4077,
  code: 'ECONNRESET',
  syscall: 'read'
}
Cliente Redis connected to the server
The Redis Client was not able to connect to the server: Error: read ECONNRESET
    at TCP.onStreamRead (node:internal/stream_base_commons:218:20) {
  errno: -4077,
  code: 'ECONNRESET',
  syscall: 'read'
}
The Redis Client was not able to connect to the server: Error: read ECONNRESET
    at TCP.onStreamRead (node:internal/stream_base_commons:218:20) {
  errno: -4077,
  code: 'ECONNRESET',
  syscall: 'read'
}
Cliente Redis connected to the server

这就是我在控制器方法中处理 redis 的方式。

const { User } = require('../models');
const asyncHandler = require('../middlewares/async');
const { connect } = require('../redis/redis')

//@route    GET api/users/
//@desc     Get all users
//@access   Private
exports.getUsers = asyncHandler(async (req, res, next) => {
   const redis = await connect();

   const key = 'users';
   const redisUsers = await redis.get(key);

   if( redisUsers ) {
      console.log('Users From Redis')
      return res.status(200).json({
         success: true,
         data: JSON.parse(redisUsers)
      })
   }
      
   console.log('Users From DB')
   const users = await User.findAll();
   await redis.set(key, JSON.stringify(users));
   return res.status(200).json({
      success: true,
      data: users
   })
});

在我的本地环境中,如果我将redis连接到端口6379并连接到主机

localhost
,它工作正常,但是一旦我尝试连接到azure中的redis服务,它就会失败。

在浏览器的网络选项卡中,当我向显示用户列表的视图发出请求时,我长时间收到请求,没有状态代码,最后我收到 CORS 错误,但 CORS 是从 azure 启用的。最后,我前端的响应类型为

text/x-component
而不是 json。

注意:此错误仅发生在我的服务器中包含redis的请求中

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

在尝试您的代码并在 Azure 中添加 CORS 时,我遇到了 CORS 问题。除了 Azure CORS 设置之外,我们还需要使用 CORS 包在代码中添加 CORS。 要解决 SSL/TLS 配置和 CORS 的问题,请按照以下步骤操作

  • 在 Azure Redis 缓存中添加 TLS 协议的配置设置。

  • 将cors添加到node js代码中,如下面的示例代码所示


const  cors = require('cors');

// CORS configuration

const  corsOptions = {

origin: "*",

methods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"],

allowedHeaders: ["Origin", "X-Requested-With", "Content-Type", "Accept"],

};

app.use(cors(corsOptions));


我使用此参考在 Azure Web 应用程序中启用传输层安全 (TLS) 配置

enter image description here

enter image description here

enter image description here

res.setHeader('Content-Type', 'application/json'); // Set the correct Content-Type header


enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.