Отправить сообщение JSON в хранилище очередей Azure - PullRequest
1 голос
/ 26 июня 2019

Я использую 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-toxic {"userId":"a6c8a103-dacc-4b15-bffd-60693105f131","token":"xxxx"}

Не знаю, почему кавычка заменяется кодом ASCII в очереди?

Я проверил что-то еще!Из моего сервиса я вызываю функцию Http Azure, и эта функция вызывает хранилище очереди, и это работает следующим образом: s ..

Очередь вызова функции HttpTrigger context.bindings.notificationQueue = [{ userId: name, token }];

И очередь полученаdata context.log(`Received userId ${queueItem.userId} :: ${queueItem.token}`);

Почему с помощью функции HttpTrigger для функции QueueTrigger она работает, но когда я использую библиотеку, «azure-storage» не работает?

Thx

1 Ответ

1 голос
/ 26 июня 2019

Не знаю, почему в очереди заменяется код 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, '&lt;')
    .replace(/>/gm, '&gt;')
    .replace(/"/gm, '&quot;')
    .replace(/'/gm, '&apos;');
};

Одним из возможных решений было бы преобразование строки в строку в кодировке base64, как вы предложили. Однако, если вы используете SDK для получения сообщений, вы не должны видеть эти &quot; в своем теле сообщения, так как SDK заботится о декодировании сообщения.

...