使用NodeJS承诺在DynamoDB中创建记录



我想使用NodeJS函数在dynamoDB中创建一个新记录,但在我需要使用stripe API创建事务之前,以及在我将信息存储在dynamoDB中之后。

我写了这几行代码,但没有任何东西会插入发电机。有什么想法吗?

import * as Stripe from "stripe";
const randomBytes = require('crypto').randomBytes;
const AWS = require('aws-sdk');
AWS.config.update({ region: 'eu-central-1' });
import { SECRET_API_KEY } from "../config";
/** Config */
const stripe = new Stripe(SECRET_API_KEY);
const ddb = new AWS.DynamoDB.DocumentClient();
AWS.config.update({ region: 'eu-central-1' });
export async function createCustomerAndSubscribeToPlan(
stripeToken: string,
email: string,
productPlan: string
): Promise<any> {
// create a customer
const customer = await stripe.customers.create({
email: email,
source: stripeToken
});

// retrieve created customer id to add customer to subscription plan
const customerId = customer.id;
// create a subscription for the newly created customer
const subscription = await stripe.subscriptions.create({
customer: customerId,
items: [{ plan: productPlan }]
});
/** Insert inside S3 Storage the user and validity */
const record = await recordSub(stripeToken, email, productPlan);
return subscription;
}
function recordSub(stripeToken, email, productPlan) {
const subrisctionId = toUrlString(randomBytes(16));
console.log('Putting inside db ' + subrisctionId);
return ddb.put({
TableName: 'OG_SUBRISCPTIONS',
Item: {
OG_SUBRISCPTIONS_ID: subrisctionId,
ProductPlan: productPlan,
RequestTime: new Date().toISOString()
}
}).promise();
}
function toUrlString(buffer) {
return buffer.toString('base64')
.replace(/+/g, '-')
.replace(///g, '_')
.replace(/=/g, '');
}

多亏了@Wyetro,我还修改了以前的代码,添加了AWS配置,并将lambda函数移到了DynamoDB的同一AWS区域中。我还用AWS CloudWatch丰富了我的LambdaRole,现在我收到了以下错误消息:

2020-04-23T06:49:40.673Z    79140900-41ff-41aa-bab6-7d1ca6aabec2    INFO    Putting inside db NRc_xX_dhep6XSbts51Sxw
2020-04-23T06:49:40.691Z    79140900-41ff-41aa-bab6-7d1ca6aabec2    ERROR   (node:7) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
END RequestId: 79140900-41ff-41aa-bab6-7d1ca6aabec2
REPORT RequestId: 79140900-41ff-41aa-bab6-7d1ca6aabec2  Duration: 1851.16 ms    Billed Duration: 1900 ms    Memory Size: 1024 MB    Max Memory Used: 126 MB Init Duration: 593.69 ms    

在AWS论坛上进行了一些研究后,我发现了AWS-sdk模块版本内部的问题,升级后问题仍然存在。CloudWatch中没有错误,但表中有任何错误。

START RequestId: 61b612b4-b9a1-40ce-b6e8-5d75493ba8ea Version: $LATEST
2020-04-23T07:52:08.224Z    61b612b4-b9a1-40ce-b6e8-5d75493ba8ea    INFO    Putting inside db EG8UiaSElpfis7MyWanBTg
END RequestId: 61b612b4-b9a1-40ce-b6e8-5d75493ba8ea
REPORT RequestId: 61b612b4-b9a1-40ce-b6e8-5d75493ba8ea  Duration: 2039.72 ms    Billed Duration: 2100 ms    Memory Size: 1024 MB    Max Memory Used: 129 MB Init Duration: 631.94 ms    

问题是recordSub没有返回promise。您需要添加.promise()以使DocumentClient做出承诺:

return ddb.put({
TableName: 'OG_SUBRISCPTIONS',
Item: {
OG_SUBRISCPTIONS_ID: subrisctionId,
ProductPlan: productPlan,
RequestTime: new Date().toISOString()
}
}).promise();

看起来你也没有设置你的AWS区域。

AWS.config.update({ region: 'us-east-1' }); // Set to whatever your region is

此外,你确定你的表名和id是正确的吗?SUBRISCPTIONS不是SUBSCRIPTIONS的正确拼写。

已解决。我错过了recordSub呼叫中的"等待"。问题已编辑。

最新更新