Node.js使用Redis向Stream推送消息时request body值传入解析问题
问题解决方案
导致解析异常的核心原因有两个:
- 手动拼接JSON字符串无法处理变量中的特殊字符:如果
userID、username包含双引号、反斜杠、换行等特殊字符,会直接破坏JSON结构,引发解析错误 - 现有xadd参数不符合规则:Redis的xadd方法传入消息内容时要求field和value成对出现,你当前代码在硬编码的message值之后多传入了一个独立的JSON字符串,属于参数结构错误
修正方案
不要手动构造JSON字符串,先定义符合结构的JS对象,再通过JSON.stringify()方法转为标准JSON字符串传入,既可以自动处理所有特殊字符转义,也能避免手动写JSON的格式错误。
修正后代码如下:
async function userRegister (request) { var userID = request.body.userID || '' var username = request.body.userName || '' // 先构造消息内容的JS对象 const messageContent = { "module": "*", "user_id": userID, "username": username } // 转成标准JSON字符串,自动处理转义 const messageStr = JSON.stringify(messageContent) redisClient.xadd( 'user:create', '*', 'module', 'userRegister', 'request_id', '2312432434', 'message', messageStr, // 直接传入生成好的JSON字符串即可 function (err, resp) { if (err) { console.log(err) } else { console.log(resp) } } ) }
如果你需要保留原来那条硬编码的测试消息,额外新增一对field-value即可,比如给硬编码消息指定
test_message作为field名,不要直接在参数列表里拼接无归属的JSON字符串。
内容的提问来源于stack exchange,提问作者vlas fama
相关产品推荐
相关产品推荐

