【问题标题】:AWS Lambda To DynamoDBAWS Lambda 到 DynamoDB
【发布时间】:2022-01-18 16:28:28
【问题描述】:

我正在尝试通过 lambda 函数将我的前端连接到 DynamoDB。我无法理解如何修复 lambda 函数以使其正常工作。目前它只是发布 undefined 到 PK 和 SK。

Lambda 函数

"use strict";
require("dotenv").config();
// const config = require("../../config/keys");
const AWS = require('aws-sdk')
AWS.config.update({ region: "eu-west-1" });
const documentClient = new AWS.DynamoDB.DocumentClient();

const addJobListing = async (data) => {
  const body = {
    TableName: "XXXXXX",
    Item: {
      "PK": `${data.acc}${data.jobId}${data.startDate}`,
      "SK": `${data.jobId}.${data.startDate}`,
      "Days Off": data.daysOff,
      "Start Date": data.startDate,
      "Job ID": data.jobId,
      "Contract Length": data.contractLength,
      "Expiration Date": data.expirationDate,
      Created: {
        M: {
          CREATED: {
            M: { date: data.createdDate, time: data.createdTime },
          },
        },
      },
      Insurance: data.insurance,
      Title: data.title,
      Holidays: data.holidays,
      Ages: data.ages,
      "Flight Reimbursement": data.flightReimbursement,
      Curriculum: data.curriculum,
      "Account ID": data.accountId,
      "Minimum Monthly Salary Before Tax": data.minimumMonthlySalaryBeforeTax,
      "Housing Allowance": data.housingAllowance,
      Responsibilities: data.responsibilities,
      "Job Closest Metro": data.jobClosestMetro,
      "Job Requirements": data.jobRequirements,
      "Job Type": data.jobType,
      "Z-VISA Reimbursement": data.zVisaReimbursement,
      Meals: data.meals,
      Subject: data.subject,
      "Salary Information": data.salaryInformation,
      "Maximum Monthly Salary Before Tax": data.maximumMonthlySalaryBeforeTax,
      "Vacancy Status": data.vacancyStatus,
      "Contract Completion Bonus": data.contractCompletionBonus,
      "Last Modified": {
        M: {
          LAST_MODIFIED: {
            M: {
              date: data.modifiedDate,
              time: data.modifiedTime,
            },
          },
        },
      },
    },
  };

  console.log("Job Listing ID", `${data.jobId}.${data.startDate}`);
  return await documentClient.put(body).promise();
};

exports.handler = async (event, context, callback) => {
  console.log("PRINT STRING", event);
  const response = await addJobListing(JSON.parse(event.body));
  console.log("resp", response);
  return {
    statusCode: 200,
    headers: {
      "Access-Control-Allow-Origin": "*", // Required for CORS support to work
      "Access-Control-Allow-Credentials": true, // Required for cookies, authorization headers with HTTPS
    },
    body: JSON.stringify(response),
  };
};

CloudWatch 上,错误是: resp undefined, Job Listing ID undefined.undefined.

 body: '{\r\n' +
    '    "Item": {\r\n' +
    '    "PK": "ACC#010117/01/2022",\r\n' +
    '    "SK": "01.17/01/2022",\r\n' +
    '    "Start Date": "17/01/2022",\r\n' +
    '    "Job ID": "01"\r\n' +
    '    }\r\n' +
    '  }',

我通过 API Gateway 发送到端点 API 的数据是这个 JSON:

{
    "Item": {
    "PK": "ACC#010117/01/2022",
    "SK": "01.17/01/2022",
    "Start Date": "17/01/2022",
    "Job ID": "01"
    }
  }

邮递员信息返回

Request Headers:
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.0
Accept: */*
Postman-Token: xxxxxxxxx
Host: xxxxxxxxxxx-execute.aws.eu-west-1.amazonaws.com
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 130

Request Body:
Response Headers
Date: Mon, 17 Jan 2022 18:39:41 GMT
Content-Length: 0
Connection: keep-alive
access-control-allow-origin: *
access-control-allow-credentials: true
Apigw-Requestid: xxxxxxxxxxxxxxx

Response Body:
0

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-dynamodb aws-api-gateway dynamodb-queries


    【解决方案1】:

    查看请求正文的 JSON:

    {\r\n' +
        '    "Item": {\r\n' +
        '    "PK": "ACC#010117/01/2022",\r\n' +
        '    "SK": "01.17/01/2022",\r\n' +
        '    "Start Date": "17/01/2022",\r\n' +
        '    "Job ID": "01"\r\n' +
        '    }\r\n' +
        '  }
    

    没有密钥accjobIdstartDate 或您尝试使用的任何密钥。键名中包含大写字母和空格。而acc 绝对不是钥匙。

    例如:

       "PK": `${data.acc}${data.jobId}${data.startDate}`,
    

    需要这样:

       "PK": data['PK'],
    

    还有这个:

       "Job ID": data.jobId,
    

    需要这样:

       "Job ID": data['Job ID'],
    

    【讨论】:

    • 嗨,马克,我必须添加 data["Item"]["Job ID"] 才能工作。您知道如何使其适用于 Mapped 或 SS 属性以及字符串吗?
    • 我不明白您所说的“映射或 SS 属性”是什么意思。
    • 嗨,马克,AWS 定义了属性。您可以在这里找到更多信息:docs.aws.amazon.com/amazondynamodb/latest/APIReference/…
    • 这些是属性类型,它们是您需要从提交到 API 网关并传递到函数中的字符串构建的 DynamoDB 属性。
    • 最后一个问题:为了在表中添加 Created 列,我正在尝试使用 JSON 重新创建它:{ "CREATED" : { "M" : { "date" : { "S" : " 12/01/2022" }, "time" : { "S" : "09:02:12:00" } } } } 您如何建议编写 JSON 以在 DynamoDB 表中重现这一点?
    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多