提问者:小点点

AWS中的节点函数引发“意外令牌”错误


我在AWS中创建了一个Lambda函数(Node.js12.x),这样SNS消息就可以从我们的ETL工具Matillion中推送到Slack。

console.log('Loading function');

const https = require('https');
const url = require('url');
const slack_url = 'https://hooks.slack.com/services/T1MJBHQ95/B01DQ60NUR2/....';
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: `${rec.Sns.Message}` });

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

由于出现“意外令牌;”,该函数将不会执行。最后一行req.write(json.stringify...出错。

我的研究显示了几个挑战:

  • 我可能需要一个名为eslint.rc的文件,但我不清楚为什么需要放入。
  • 不推荐使用“require”和“exports”。

有人能给我指点一下,如何集中精力解决这个问题吗?谢谢。


共2个答案

匿名用户

只需使用Axios,它会让你的生活更轻松:

console.log('Loading function');

const axios = require('axios');
const url = require('url');
const slack_url = 'https://hooks.slack.com/services/T1MJBHQ95/B01DQ60NUR2/....';

exports.handler = async (event, context) {
   (event.Records || []).forEach(function(rec) {
      if (rec.Sns) {
         axios.post(slack_url, {
            text: rec.Sns.Message
         }, {
            'Content-Type': 'application/json'
         }).done(r => {
           context.succeed('sns posted to slack');
         }).catch(e => {
           context.fail('status code: ' + e.statusCode);
     });
});

请注意,在您的代码中,在1个sns事件之后,他结束了调用,而不是全部运行,要运行所有这些事件,您需要等待所有请求完成(例如,可以使用promise.all)

另外,请注意sns可以直接发送到HTTPS,而不需要任何代码HTTPS://aws.amazon.com/sns/features/

顺便说一下,您可以使用一个外部监控工具,它将以lumigo的形式向您显示出确切的传出请求+所有有效负载(作为免责声明,我为一家名为lumigo的公司工作)

匿名用户

您在代码中犯了语法错误。

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

需要在req.write()语句中的之前添加)