首页 > 解决方案 > AWS PUT 请求遇到“提供的关键元素与架构不匹配”。

问题描述

(编辑以纳入评论)所以我提前为这个冗长的问题道歉。我不知道还能怎么问。我正在尝试使用 React、Node 和 DynamoDB 完成一个全栈 Web 应用程序。POST 和 GET 请求工作正常,但我被困在 PUT 上。我的模拟 PUT 请求工作正常,但是一旦我从 React 的前端尝试它,我就会得到标题中提到的错误。我将首先展示后端代码,然后是模拟更新,然后是前端。

import handler from "./libs/handler-lib";
import dynamoDb from "./libs/dynamodb-lib";

export const main = handler(async (event, context) => {
  const data = JSON.parse(event.body);
  const params = {
    TableName: process.env.tableName,
    Key: {
      userId: event.requestContext.identity.cognitoIdentityId,
      activityId: event.pathParameters.activityId
    },
    UpdateExpression: "SET title = :title, activityType = :activityType, activityRoutine = :activityRoutine, activityComment = :activityComment",
    ExpressionAttributeValues: {
      ":title": data.title || null,
      ":activityType": data.activityType || null,
      // ":activityRoutine": data.activityRoutine == '' ? "None" : data.activityRoutine,
      // ":activityComment": data.activityComment == '' ? "None" : data.activityComment
      ":activityRoutine": data.activityRoutine || null,
      ":activityComment": data.activityComment || null
    },
    ReturnValues: "ALL_NEW" 
  };

  await dynamoDb.update(params);
  return { status: true };

这个模拟更新事件没有问题:

{
    "body": "{\"title\":\"test\",\"activityType\":\"testing\",\"activityRoutine\":\"\",\"activityComment\":\"\"}",
    "pathParameters": {
      "activityId": "long-alphanumeric-id"
    },
    "requestContext": {
      "identity": {
        "cognitoIdentityId": "us-east-and-so-on"
      }
    }
  }

但是这段代码产生了与模拟完全相同的 Javascript 对象,不适用于 AWS:

 function saveActivity(activity) {
    try {
      return API.put("activities", `/activities/${id}`, {
        body: activity
      });

    } catch(e) {
      console.log("saveActivity error:", e);  
    }
  }

  async function handleSubmit(event) {

    event.preventDefault();

    setIsLoading(true)
      try {
        await saveActivity({
          title: title, activityType: activityType, activityRoutine: activityRoutine, activityComment: activityComment
          // "key": {userId: userId, activityId: activityId}
          // "pathParameters": {"id": activityId},
          // "requestContext": {"identity": {"cognitoIdentityId": userId}}
        });
      } catch(e) {
        console.log(e)
        setIsLoading(false)
      }
    }

如果有人需要查看更多代码,我很乐意分享,但我认为这个问题已经很长了。您看到的任何被注释掉的代码都曾尝试过但没有成功。就 AWS 文档而言,如果有人能指出我正确的方向,我也会很高兴。我一直在学习教程并在需要的地方进行修改。任何帮助表示赞赏!

标签: node.jsreactjsamazon-web-servicesamazon-dynamodbput

解决方案


推荐阅读