【问题标题】:simple node.js example in aws lambdaaws lambda 中的简单 node.js 示例
【发布时间】:2015-08-18 16:29:42
【问题描述】:

我正在尝试使用 aws lambda 发送一个简单的请求。

我的模块结构如下:

mylambda
|-- index.js
|-- node_modules
|   |-- request

我将文件压缩并上传到 lambda。

然后我调用它,它返回以下错误。 "errorMessage": "Cannot find module 'index'"

这里是 index.js 文件的内容

var request = require('request');

exports.handler = function(event, context) {

    var headers = { 'User-Agent': 'Super Agent/0.0.1', 'Content-Type': 'application/x-www-form-urlencoded' }

    // Configure the request
    var options = {
        url: 'https://myendpoint',
        method: 'POST',
        headers: headers,
        form: {'payload': {"text":""} }
    }

    // Start the request
    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body)
        }
    })

    console.log('value1 =', event.key1);
    context.succeed(event.key1);  // Echo back the first key value
};

感谢任何帮助,谢谢

【问题讨论】:

  • 您在 Lambda 函数配置中的“处理程序”值是多少?
  • index.handler,当我删除对请求模块的调用时,代码运行良好并执行

标签: javascript node.js amazon-web-services amazon-s3


【解决方案1】:

任务:编写一个 aws lamda 函数:

我看到我们的表现如何:

  1. 我们在 aws 编辑器中编写代码并运行它

  2. 没有按预期运行,放了很多控制台(因为我们无法调试我们的代码)

  3. 等待几秒钟,然后在另一个窗口中看到控制台,不断更改窗口,直到我们解决我们的问题

    4.更换窗户需要花费大量时间和精力。

为什么我们不能?

  1. 在我们的服务器(不是 aws 编辑器)中编写代码,然后将该代码发送到 aws。

是的,我们可以。

  1. 新功能(https://davidwalsh.name/new-function) 变相加持 概念。

示例代码:

let fs = require('fs');
const aws = require("aws-sdk");
const s3 = new aws.S3(),
    async = require('async');
aws.config = {
    "accessKeyId": "xyz",
    "secretAccessKey": "xyz",
    "region": "us-east-1"
};
fs.readFile('path to your code file', 'utf-8', async (err, code) => {
    if (err) return res.status(500).send({ err });
    async function uploadToS3(docs) { (only this function has to go into aws editor)
        let func = new Function('docs', "aws", "s3", 'async', `${code}`);
        return func(docs, aws, s3, async); 
    }
    let resp = await uploa`enter code here`dToS3(req.files.docs);(this line will call aws lambda function from our server)
    return res.send({ resp });
});

我在文件中编写的代码:

docs = Array.isArray(docs) ? docs : [docs]
let funArray = [];
docs.forEach((value) => {
    funArray.push(function (callback) {
        s3.upload({
            Bucket: "xxx",
            Body: value.data,
            Key: "anurag" + "/" + new Date(),
            ContentType: value.mimetype
        }, function (err, res) {
            if (err) {
                return callback(err, null);
            }
            return callback(null, res);
        });
    });
});
return new Promise((resolve, reject) => {
    async.parallel(funArray, (err, data) => {
        resolve(data);
    });
});

好处:

  1. 由于整个代码将在我们熟悉的 IDE 中编写,因此很容易调试。
  2. 只有两行代码必须进入 aws 编辑器(这很不容易)。
  3. 很容易修改/更新代码(因为代码将在我们的 repo 中,我们甚至可能不必使用 aws 编辑器)。
  4. 是的,我们可以使用其他第三方库,但上面的东西是用纯 JavaScript 编写的,没有使用第三方库。
  5. 另外,在这里您不必部署代码。
  6. 有时我们的库总大小增加到 5 MB,AWS lambda 编辑器停止支持它。 它也将解决这个问题,现在我们将只从库中发送所需的函数,而不是整个库 平均而言,异步库包含大约 100 个函数,但我们使用 1-2 个函数。所以,现在我们将只发送我们将要使用的函数。

注意:

  1. 我搜索了很多,但没有找到这种东西。
  2. 以上代码会将文档上传到 s3 存储桶。

【讨论】:

    【解决方案2】:

    您只需压缩和上传子文件夹,而不是根文件夹。您必须按照您的示例压缩以下文件夹,然后上传:

    |-- index.js
    |-- node_modules
        |-- request
    

    【讨论】:

      【解决方案3】:

      现在一切正常,我不得不在高级设置中增加 Timeout(s) 秒,因为它花费的时间超过 3 秒。

      我还必须确保我的节点模块安装正确。在试图找出问题所在时,我搞砸了请求模块。

      要重新安装模块,我删除然后重新安装请求

      • 已删除 node_modules
      • npm init
      • 在package.json中添加了依赖"request" : "*"
      • npm install。压缩zip并上传,现在一切正常。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-24
        • 2021-07-17
        • 1970-01-01
        • 2018-11-20
        • 2018-02-23
        • 2015-01-25
        相关资源
        最近更新 更多