为什么结合使用Node Express与Redis时无法正常设置简单键值对?
问题排查与解决方案
核心问题原因
- 最常见的原因是你使用了v4及以上版本的redis Node.js客户端:v4版本做了不兼容升级,默认使用Promise异步API,且初始化后需要主动调用
connect()方法建立连接,旧回调式API需要额外开启兼容配置,你当前的代码没有做适配。加上GET和PUT请求的执行时序差异,GET请求执行时客户端刚好完成连接建立,所以能正常执行,而PUT请求执行时连接还未就绪,命令被挂起未执行,就会出现GET正常、PUT失败的现象。 - 次要逻辑问题:你在拼接value时额外加了一层单引号,会导致写入Redis的值多了不必要的引号包裹,不符合预期;同时express的错误响应写法不符合规范,可能导致响应异常掩盖错误信息。
- 易忽略的请求问题:发送PUT请求时未携带
Content-Type: application/json请求头,导致body-parser无法正确解析请求体,req.body为空对象,写入的值不符合预期。
修复步骤
1. 适配redis客户端版本
如果确认使用redis v4+,修改redis初始化代码,可选择开启legacy模式兼容旧回调写法:
// redis v4 初始化写法 const RedisCli = require('redis').createClient({ url: REDIS_CONNECTION_STRING, // 开启legacy模式兼容旧回调写法,不需要的话可以不加 legacyMode: true }); // 主动建立连接,v4版本必须加这一行 RedisCli.connect().catch(console.error); RedisCli.on('connect', function() { console.log('Connected to REDIS'); }); RedisCli.on('error', function(err) { console.log('/!\ REDIS ERROR: ' + err); });
2. 修复PUT接口逻辑
去掉多余的单引号,修改响应写法,增加错误日志方便排查:
// 回调式写法(开启legacy模式可用) app.put('/set/:key', function(req, res) { // 去掉多余的单引号,直接存储JSON序列化结果 var value = JSON.stringify(req.body); console.log("SET " + req.params.key + " " + value); RedisCli.set( req.params.key, value, function (err, result) { if (err) { console.error('写入失败:', err) res.status(500).send(err); } else { res.send(result); } }); }); // Promise式写法(不需要开启legacy模式) app.put('/set/:key', async function(req, res) { const value = JSON.stringify(req.body); console.log("SET " + req.params.key + " " + value); try { const result = await RedisCli.set(req.params.key, value); res.send(result); } catch (err) { console.error('写入失败:', err); res.status(500).send(err); } });
3. 检查请求配置
发送PUT请求时必须携带请求头Content-Type: application/json,同时填写合法的JSON格式请求体。
内容的提问来源于stack exchange,提问作者frva
相关产品推荐
相关产品推荐

