【问题标题】:Serverless: dynamodb giving error on create record when trying with async/await无服务器:尝试使用 async/await 时,dynamodb 在创建记录时出现错误
【发布时间】:2018-12-18 05:28:22
【问题描述】:

我正在尝试在 dynamodb(使用 dynamoose)中创建记录。代码是

class Test {
  constructor() {
    this.table = dynamoose.model(tableName, tableSchema);
  }
//  userdata object - { 
//  cusotmerEmail: 'tushar.gaurav+testf40@accionlabs.com',
//  customerBusinessName: 'DoogleDnd',
//  customerFirstName: 'Tushar',
//  customerId: 101211,
//  customerLastName: 'Gaurav',
//  isDeleted: false,
//  sku: '100',
//  userId: '5c1776e94bea867c3f896236' 
// }


  async createUser(userData) {
    try {
      const res = await this.table.create(userData);
      console.log('Update user record - ', res);
      return res;
    } catch (error) {
      throw new Error(error);
    }
  }
}

*create 函数的输入值与我尝试使用 batchPut() 的相同输入是正确的,它正在工作。 甚至更新对表的调用也可以正常工作。

async updateUser(userData) {
    try {
      const res = await this.table.update(userData);
      console.log('Updated user record - ', res);
      return res;
    } catch (error) {
      throw new Error(error);
    }
 }

这是我得到的错误 - 错误 - {"message":"条件请求失败", "code":"ConditionalCheckFailedException", "statusCode":400}

这是调用函数 -

module.exports.subscribeUser = async (event) => {
  let inputBody = (typeof event.body === 'object' ? event.body : 
  JSON.parse(event.body));
  inputBody.userId = event.pathParameters.id;
  try {
    // Validate input
    await asisvc.validateInput(inputBody);

    inputBody = await UserSvc.constructUserObject(inputBody);
    console.log('Constructed object - ', JSON.stringify(inputBody));

    const userData = await testObj.createUser(inputBody);
    return Utils.buildResp(codes.ok, { userData }, {});
  } catch (error) {
    console.log(error);
    return Utils.buildResp(codes.badrequest, { Error: 
Utils.getErrString(error) }, {});

} };

我尝试用谷歌搜索它,但没有找到任何合适的文档。 提前致谢。

【问题讨论】:

  • 您能否也显示调用这些函数的代码并编写预期输出和实际发生的情况?
  • 可能不相关,但你知道 a) 如果你实际上没有对它做任何其他事情,那么捕获和重新抛出你的错误没有任何好处,并且 b) Error 构造函数需要一个字符串message 作为它的第一个参数,而不是一个对象。
  • 另外,你得到了什么实际错误?
  • @libik 编辑了问题,请看一下。

标签: node.js async-await aws-lambda amazon-dynamodb dynamoose


【解决方案1】:

在 Dynamoose 中,默认情况下,我们在使用 Model.create 方法时检查表中是否已经存在主键。

所以你的错误:

{"message":"The conditional request failed", "code":"ConditionalCheckFailedException", "statusCode":400}

表示主键已经存在于表中。所以你正在尝试创建一个重复的项目。

documentation 中有一个选项属性,您可以使用它来允许覆盖对象。

例如,以下代码将允许覆盖:

const res = await this.table.create(userData, {overwrite: true});

【讨论】:

    猜你喜欢
    • 2016-10-28
    • 2021-01-19
    • 2021-01-31
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2013-03-04
    相关资源
    最近更新 更多