【问题标题】:Getting empty value from Lambda从 Lambda 获取空值
【发布时间】:2020-04-09 19:42:11
【问题描述】:

AWS 新手,使用 Node.JS 开发 Lambda

我有以下代码在我的本地工作,但是一旦我上传到 Lambda(通过具有成功状态的 CLI).. 但是我意识到它抱怨 index.hanlder 问题。因此,在谷歌搜索之后,我将代码更新到了第二个版本,它在 Status 200 下运行良好,但返回一个 NULL。

我已经测试了本地代码,它会从 DynamoDB 返回我的数据。这里似乎有什么错误?

提供额外信息:

  • 我的 .zip 包含以下内容(index.js、node_modules、package-lock.json、package.json)

本地代码

const express = require('express');
const router = new express.Router();
const awsSDK = require('aws-sdk');
const dynamodb = new awsSDK.DynamoDB({region:'maskedData', apiVersion:'maskedData'});

router.get('/get', (req,res) => {
const params = {
        TableName: "maskedData"
    };
    dynamodb.scan(params, function(err, data){
        if(err){
            console.log(err);
            // callback(err);
            res.send(err);
        } else {
            console.log(data);
            // callback(null, data);
            res.send(data);
        }
    })

})

module.exports = router;

第二版

const express = require('express');
const router = new express.Router();
const awsSDK = require('aws-sdk');
const dynamodb = new awsSDK.DynamoDB({region:'maskedData', apiVersion:'maskedData'});

exports.handler = router.get('/get', (req,res) => {
// router.get('/get', (req,res) => {
const params = {
        TableName: "maskedData"
    };
    dynamodb.scan(params, function(err, data){
        if(err){
            console.log(err);
            // callback(err);
            res.send(err);
        } else {
            console.log(data);
            // callback(null, data);
            res.send(data);
        }
    })

})

// module.exports = router
// exports.handler = router;

【问题讨论】:

    标签: node.js amazon-web-services express aws-lambda amazon-dynamodb


    【解决方案1】:

    要用作 lambda,您需要具有事件、上下文和回调参数(可选)的处理函数。像这样的

    const express = require("express");
    const awsSDK = require("aws-sdk");
    const dynamodb = new awsSDK.DynamoDB({"region": "maskedData", "apiVersion": "maskedData"});
    
    exports.handler = async event => {
      const params = {
        "TableName": "maskedData"
      };
      const data = await dynamodb.scan(params).promise();
      return data;
    };
    
    

    aws sdk 支持 Promise 版本,因此您可以使用它而不是基于回调。

    【讨论】:

    • 我知道有这个事件,上下文,回调。事实上,在转向本地代码之前,我在 Lambda 编辑器上进行了练习。但是,如果我要在本地执行此操作,我应该如何处理 express 和 express.router() ??
    • 你的 lambda 用例是什么?你想在 lambda 上使用 express 吗?
    • 是的,将在 Lambda 上使用 Express、Body-Parser 等。
    • 你打算如何使用 lambda 的 express api?我认为这不是正确的方法。您将如何访问这些路线?并且由于 lambda 是短暂的,express 应用程序将消失
    • 我想你刚刚把我吵醒了.. lambda 是无状态的,旨在执行快速任务。感谢您指出并快速回答!
    猜你喜欢
    • 2018-03-06
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多