Using DynamoDB JavaScript AWS SDK
The full documentation is here, https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-dynamodb/index.html
To read and write an item in DynamoDB
// dynamodbClient.ts
import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"
import { DynamoDBClient } from "@aws-sdk/client-dynamodb"
import 'dotenv/config'
export const ddbClient = new DynamoDBClient({ region: 'eu-west-1' })
export const ddbDocClient = DynamoDBDocumentClient.from(ddbClient)
import { GetCommand, PutCommand } from "@aws-sdk/lib-dynamodb"
import config from "../config"
import { ddbDocClient } from "./dynamodbClient"
import { Job } from "./types"
const tableName = `${config.component}-jobs-${config.run_env}`
export async function upsertJob(job: Job) : Promise<[Job, string]> {
const params = {
TableName: tableName,
Item: job
}
try {
await ddbDocClient.send(new PutCommand(params))
return [job, '']
} catch (error) {
console.log(error)
return [job, (error as Error).message]
}
}
export async function getJob(email: string, jobId: string)
: Promise<[Job, string]> {
const params = {
TableName: tableName,
Key: {
email,
jobId
}
}
try {
const result = await ddbDocClient.send(new GetCommand(params))
return [result.Item as Job, '']
} catch (error) {
console.log(error)
return [{} as Job, (error as Error).message]
}
}
Query
You have to convert DynamoDB Record to JavaScript object with unmarshall
export async function getJobs(email: string)
: Promise<[Job[], string, string]> {
const params = {
TableName: tableName,
KeyConditionExpression: "email = :email",
ExpressionAttributeValues: {
":email": { S: email },
}
}
try {
const result = await ddbDocClient.send(new QueryCommand(params))
return [
result.Items?.map(x => unmarshall(x)) as Job[],
result.$metadata.httpStatusCode.toString(),
''
]
} catch (error) {
console.log(error)
return [
{} as Job[],
error.$metadata.httpStatusCode,
(error as Error).message
]
}
}
Comments