AWS Lambda & JSON.stringify \\ n -> \ n - не работает со Slack API - PullRequest
2 голосов
/ 10 октября 2019

Мы используем лямбда-функцию (узел js) для отправки сообщения в наш слабый канал, который работает. Однако, когда aws получает новую строку в формате \n. Затем JSON.stringify кодирует это в \\n - и сообщение в slack похоже на "this is \n a new line". Я уже пытался заменить \\n на \n, но это не сработает (нет сообщений в Slack). Если я проверяю вывод консоли, то он:

{"text":"\"This is a \

 new line\""}

Так что он действительно заменяет его новой строкой. Но на самом деле мне нужна замена с "This is a \\n new line" на "This is a \n newline", где \n рассматривается как текст, поэтому API slack знает об этом ... ??

req.write(  JSON.stringify({text: JSON.stringify(rec.Sns.Message, null, '  ')}).replace('\\n', '\n')  );

По запросуинформация - это веб-крючок в Slack, да:)

Если честно, я немного растерялся, так как понятия не имею, как отлаживать напрямую в AWS. Я просто предполагаю, что у меня есть что-то вроде этого:

console.log(     JSON.stringify({text: JSON.stringify("Thats a new \n line", null, '  ')})   ); 

Так что я получаю \\n в консоли. Затем я попытался

console.log(     JSON.stringify({text: JSON.stringify("Thats a new \n line", null, '  ')}).replace("\\n", "\n")   ); 

, который на самом деле работает, но затем вывод консоли

Thats a new
line

, что имеет смысл, но нарушает мой вызов API. Поэтому я понятия не имею, как в итоге получить кодировку This is a new \n line.

Может быть, имеет смысл опубликовать полную лямбда-функцию:

console.log('Loading function');

const https = require('https');
const url = require('url');
const slack_url = 'https://hooks.slack.cosm/etc';
const slack_req_opts = url.parse(slack_url);
slack_req_opts.method = 'POST';
slack_req_opts.headers = {'Content-Type': 'application/json'};

exports.handler = function(event, context) {
  (event.Records || []).forEach(function (rec) {
    if (rec.Sns) {
      var req = https.request(slack_req_opts, function (res) {
        if (res.statusCode === 200) {
          context.succeed('sns posted to slack');
        } else {
          context.fail('status code: ' + res.statusCode);
        }
      });

      req.on('error', function(e) {
        console.log('problem with request: ' + e.message);
        context.fail(e.message);
      });

      req.write(  JSON.stringify({text: JSON.stringify(rec.Sns.Message, null, '  ')})  ); 

      req.end();
    }
  });
};

1 Ответ

0 голосов
/ 10 октября 2019

Вы не сказали, поэтому я предполагаю, что вы отправляете сообщение на входящий веб-крючок.

Правильный JSON для отправки в Slack будет следующим:

{"text": "\"This is a \n newline\""}

Причинаэто не работает для вас в том, что вы JSON кодируете текстовую строку дважды. Просто удалите внутренний JSON.stringify, и он должен работать.

req.write(  JSON.stringify({text: rec.Sns.Message})  ); 

Кстати. ручная замена частей строки должна быть последним средством, например, когда ваш язык программирования не поддерживает определенную кодировку. Это не должно быть нужно в вашем случае.

...