我正在使用azure-storage
节点模块。
我想在队列上发送JSON,并在azure函数上将其放入队列。
我在队列中发送消息。我将我的消息放入队列中。
// This is my service who send message to queue via node lib azure-storage
const queueMsg = {
userId,
token: tokenNotif
};
queueSvc.createMessage(Config.REGISTRATION_FCM_PUSH_NOTIFICATION_QUEUE, JSON.stringify(queueMsg), (err) => {
if (!error) {
this._logger.info(`User ${userId} has register this push notification token`);
resolve(true);
} else {
reject(false);
}
});
在队列函数中,我出错了,因为该函数认为不是字符串,并在xx-queue-poison上推送了消息文本
{"userId":"a6c8a103-dacc-4b15-bffd-60693105f131","token":"xxxx"}
我不知道为什么在队列上用ASCII码替换引号?
我已经测试了其他东西! 从我的服务中,我调用了Http Azure函数,而该函数调用了Queue Storage,它通过这种方式工作:s ..
HttpTrigger函数调用队列
context.bindings.notificationQueue = [{ userId: name, token }];
并排队接收数据
context.log(`Received userId ${queueItem.userId} :: ${queueItem.token}`);
为什么通过使用HttpTrigger函数对QueueTrigger函数起作用,但是当我使用lib时,“ azure-storage”不起作用吗?
Thx
答案 0 :(得分:1)
我不知道为什么在队列上用ASCII码替换引号?
基本上,SDK正在转换字符串消息以使其XML安全。如果您查看SDK中的代码,则默认情况下它将使用TextXmlQueueMessageEncoder
作为消息编码器。 encode
函数将"
替换为"
以使其XML安全。
来自SDK代码(部分代码段):
QueueService.prototype.createMessage = function (queue, messageText, optionsOrCallback, callback) {
var userOptions;
azureutil.normalizeArgs(optionsOrCallback, callback, function (o, c) { userOptions = o; callback = c; });
validate.validateArgs('createMessage', function (v) {
v.string(queue, 'queue');
v.queueNameIsValid(queue);
v.callback(callback);
});
var xmlMessageDescriptor = QueueMessageResult.serialize(messageText, this.messageEncoder);
function TextXmlQueueMessageEncoder(){
}
util.inherits(TextXmlQueueMessageEncoder, QueueMessageEncoder);
/**
* Encode utf-8 string by escaping the xml markup characters.
* @this TextXmlQueueMessageEncoder
*
* @param {string} [input] The target to be encoded.
*
* @return {string}
*/
TextXmlQueueMessageEncoder.prototype.encode = function(input){
return input.replace(/&/gm, '&')
.replace(/</gm, '<')
.replace(/>/gm, '>')
.replace(/"/gm, '"')
.replace(/'/gm, ''');
};
一种可能的解决方案是按照您的建议将字符串转换为base64编码的字符串。但是,如果您使用SDK检索消息,则SDK会负责解码消息,因此您不应在消息正文中看到这些"
。