首页 > 解决方案 > API 在将数据放入 dynamoDB 时随机工作

问题描述

我正在尝试使用无服务器部署将数据放入 Dynamodb。我已添加写入 Dynamodb 的权限。

该 api 始终在发送{"message": "Internal server error"},但如果尝试 5.6 次,则能够将数据放入 db 一次。

以下是 serverless.yaml 配置

    handler: dynamoUpdate.handler
    events:
      - http:
          path: /createdbentry
          method: get
          cors: true

以下是代码:

const AWS = require('aws-sdk')
AWS.config.update({ region: process.env.REGION || 'us-east-1' })

var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event) => {
  return await createDBEntry("i123","Working");
}

const sendRes = (status, body) => {
  var response = {
    statusCode: status,
    headers: {
      "Content-Type": "application/json"
    },
    body: body
  };
  return response;
};

const createDBEntry = async function(id,result) {
  var params = {
    TableName: 'emplist',
    Item: {
      'ID' : {S:id},
      'Summary':{S: result},
    }
  };

    ddb.putItem(params, function(err, data) {
      console.log("Here comes me.")
      if (err) {
        console.log("Opps Error");
        return sendRes(403,err);
      } else {
        console.log("Complete")
        return sendRes(200,data);
      }
    });
  }

如何解决?

标签: node.jsasync-awaitaws-lambdaamazon-dynamodbaws-api-gateway

解决方案


问题是你没有在你的函数中返回任何承诺或等待任何异步createDBEntry。因此,您的处理程序返回undefined,这使得 apigateway 返回 500 内部服务器错误。

您正在混合回调和异步/等待。你的createDBEntry函数应该是这样的。

const createDBEntry = async function(id, result) {
  var params = {
    TableName: 'emplist',
    Item: {
      'ID' : {S:id},
      'Summary':{S: result},
    }
  };

  try {
    let data = await ddb.putItem(params).promise()
    return sendRes(200, JSON.stringify(data))
  } catch (err) {
    console.log("Oops Error");
    return sendRes(403, err.toString());
  }
}

当您从 lambda 中的异步处理程序返回时,当前执行环境会立即冻结(与使用带有回调的非异步处理程序不同)。这就是为什么大多数情况下对数据库的写入都不会成功的原因。


推荐阅读