AWS Lambda - NodeJS POST 请求和异步写入/读取文件

2023-12-11

我是 NodeJS 新手,在 AWS Lambda 内部,我尝试发出一个 POST 请求,该请求使用 JSON 对象调用外部 API,使用响应创建一个文档,然后读取该文件的内容。

来自 Ruby 背景,我认为问题源于我对异步编程的不熟悉,但我尝试使用回调和 readfileSync 进行调试,但没有成功。

任何帮助,将不胜感激。

var querystring = require('querystring');
var https = require('https');
var fs = require('fs');

exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));

  var operation = event.operation;
  delete event.operation;

  var accessKey = event.accessKey;
  delete event.accessKey;

  var templateName = event.templateName;
  delete event.templateName;

  var outputName = event.outputName;
  delete event.outputName;

  var req = {
    "accessKey": accessKey,
    "templateName": templateName,
    "outputName": outputName,
    "data": event.data
  };

  function doPost(data, callback) {
    // Build the post string from an object
    var post_data = JSON.stringify(data);

    // An object of options to indicate where to post to
    var post_options = {
        host: 'hostname.com',
        port: '443',
        path: '/path/to/api',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': post_data.length
        }
    };

    // Set up the request
    var file = fs.createWriteStream(outputName);

    var post_req = https.request(post_options, function(res) {
        res.setEncoding('utf8');
        res.pipe(file);

        res.on('response', function(response)  {
            console.log(response); 
        });

        res.on('error', function(e) {
            context.fail('error:' + e.message);
        })

        res.on('end', function() {
            context.succeed('success, end request listener');
        });
    });

    // post the data
    post_req.write(post_data);
    post_req.end();
    callback();
  }

  function printFileContents() {
    fs.readFileSync(outputName, 'utf8', function (err, data) {
        console.log('file contents:' + data);
    });            
  }

  switch (operation) {
    case 'create':
        // Make sure there's data before we post it
        if(req) {
            doPost(req, printFileContents);
            printFileContents();
        }
        break;
     ...
  }
};

一般来说,我建议这样开始:

var querystring = require('querystring');
var https = require('https');
var fs = require('fs');

exports.handler = function(event, context) {
    console.info('Received event', event);

    var data = {
        "accessKey": accessKey,
        "templateName": templateName,
        "outputName": outputName,
        "data": event.data
    };

    // Build the post string from an object
    var post_data = JSON.stringify(data);

    // An object of options to indicate where to post to
    var post_options = {
        host: 'hostname.com',
        port: '443',
        path: '/path/to/api',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': post_data.length
        }
    };

    var post_request = https.request(post_options, function(res) {
        var body = '';

        res.on('data', function(chunk)  {
            body += chunk;
        });

        res.on('end', function() {
            context.done(body);
        });

        res.on('error', function(e) {
            context.fail('error:' + e.message);
        });
    });

    // post the data
    post_request.write(post_data);
    post_request.end();
};

你可以看到我大大简化了你的代码。我建议避免使用文件系统,因为这会减慢程序的速度。我也不确定你的函数的真正目标是什么,所以我只是返回 HTTP 响应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Lambda - NodeJS POST 请求和异步写入/读取文件 的相关文章

随机推荐

  • 需要在c#中进行double类型的枚举

    如何创建 double 类型的枚举 是否可能或者我必须创建某种集合和哈希 你不能把它变成一个枚举 http msdn microsoft com en us library y94acxy2 aspx 可能性之一 public static
  • 为什么 XmlPullParser 传递两个 START_DOCUMENT 事件?

    在 Android 应用程序中我有一个XmlPullParser XmlResourceParser xrp c getResources getXml rid 正如您所看到的 它来自 Android 二进制 XML 资源 并且它提供的前两
  • 检测 NSString 的语言

    有人告诉我关于 Cocoa 中的语言识别类 有人知道它是哪一个吗 This is not在职的 NSSpellChecker spellChecker NSSpellChecker sharedSpellChecker spellCheck
  • 无法在 VC++ 中使用 std::cout 打印出 argv[] 值

    这是我在该网站上的第一个问题 尽管我来这里参考已经有一段时间了 我知道 argv 0 存储程序的名称 其余命令行参数存储在剩余的 argv k 槽中 我还了解 std cout 将字符指针视为空终止字符串并打印该字符串 下面是我的程序 in
  • 如何与主应用程序一起开发另一个子模块。 [作曲家,PHP]

    我知道 git 子模块是如何工作的 以及我们如何使用它 现在我所处的情况是 主应用程序依赖于许多其他作曲家软件包 并且我必须制作和开发一个与主项目 某种库 分开的另一个小软件包 那么我如何才能将这个小包与主项目一起开发 而不使其成为单独的项
  • 反应本机启动画面获取“React/RCTBridgeModule.h”文件未找到

    我使用以下命令启动了一个新的反应本机应用程序 react native init myApplication 我从启动画面开始 所以我使用了这个库反应本机启动画面 我使用以下命令链接该库以生成本机代码 react native link r
  • 如何将标准容器作为字段添加到 OMNet++ 消息中?

    我正在尝试创建一个简单的消息定义包含一个使用实现的字段std vector 根据OMNet 5 5 手册第 1 章6秒 8 1 这看起来很简单 However I m using OMNet 6 0pre6 I can t figure o
  • 单击退出按钮时未处理 Win32Exception - Visual Basic

    我正在使用 Microsoft Visual Studio 2010 32 位高级版 Microsoft Visual Basic 2010 构建表单 当我编译代码时没有任何错误 但是每当我单击退出按钮时 它都会显示以下消息 Win32Ex
  • blackberry os 7 模拟器未在我的系统上加载

    我已经安装了blackberry os 7模拟器 9900 9930 9850 当我打开模拟器时 会显示黑莓加载屏幕 但没有完全加载 长时间显示如下图所示 我删除了位于的 dmp 文件 C Program Files Research In
  • 使用 LINQ 获取平均值

    希望有人可以帮助我使用 LINQ 语法来计算平均值 例如 我有以下 LINQ 查询 var rates from rating in ctx Rates where rating Id Id select new UserId rating
  • C++如何替换构造函数开关?

    我想用更优雅的东西替换大开关 class Base public Base void data int size virtual void Something 0 class A public Base public A void data
  • ASP.NET 到 WCF - 直通安全性?

    我有一个位于 WCF 服务之上的 MVC 网站 WCF 服务还可以通过使用消息安全和证书的用户名 密码身份验证通过 Internet 进行访问 这是设置和工作 网站和服务都使用相同的会员商店 使用会员 API 用户可以使用相同的凭据登录网站
  • 重载加法、减法和乘法运算符

    如何重载加法 减法和乘法运算符 以便我们可以对两个不同或相同大小的向量进行加法 减法和乘法 例如 如果向量大小不同 我们必须能够根据最小向量大小对两个向量进行加 减或乘 我创建了一个函数 允许您修改不同的向量 但现在我正在努力重载运算符 并
  • PhoneGap 构建错误“插件不受支持:...”

    以下 config xml 会导致错误
  • 使用弹性搜索批量索引

    到目前为止 我一直在按文档将数据索引到弹性文档 现在随着数据开始增加 它变得非常慢 并且不是一种优化的方法 所以我正在寻找批量插入的东西并找到了 Elastic Bulk API 从他们官方网站的文档中我感到困惑 我使用的方法是将数据作为
  • 有什么简单的方法可以使 GPS 坐标变得粗略吗?

    我正在开发一个使用 GPS 坐标作为排行榜的 iPhone 应用程序 我不需要精确的坐标 实际上我不需要曾经想要坐标要准确 以保护用户隐私 我为desiredAccuracy指定了kCLLocationAccuracyThreeKilome
  • Spring OAuth2.0 - 动态注册OAuth2.0客户端

    我正在使用 Spring security 设置 OAuth2 0 授权服务器 我想知道是否有办法在OAuth2 0授权服务器启动并运行后动态注册OAuth2 0客户端 基本上 我知道我可以在配置 OAuth2 0 服务器时通过扩展来注册客
  • 圆角矩形背景编辑文本,背景边框左上角有提示

    我陷入了创建用户界面的困境 请帮我创建那个 我有一个具有圆角矩形边框的 EditText 这是可以的 但占位符位于边框的顶部 离开边框 这是图像 提前致谢 你必须使用矢量绘图用于根据需要创建自定义形状 我已经为此创建了一个示例 创造自定义向
  • 如何在一行中编写多个CSS选择器?

    我的问题是我想在单选中写这个 btn primary gt i glyphicon color ffffff btn primary gt span glyphicon color ffffff 但是这个 btn primary gt i
  • AWS Lambda - NodeJS POST 请求和异步写入/读取文件

    我是 NodeJS 新手 在 AWS Lambda 内部 我尝试发出一个 POST 请求 该请求使用 JSON 对象调用外部 API 使用响应创建一个文档 然后读取该文件的内容 来自 Ruby 背景 我认为问题源于我对异步编程的不熟悉 但我