我在 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的请求中
在尝试您的代码并在 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) 配置。
res.setHeader('Content-Type', 'application/json'); // Set the correct Content-Type header