node.js - TypeError: command.resolveMiddleware er ikke en funksjon AWS Lambda Javascript V3


Jeg prøver å programmere opplasting av en hemmelighet til en AWS Secret Manager-instans ved hjelp av "@aws-sdk/client-secrets-manager": "^3.299.0", men jeg får stadig en feil. Jeg har fulgt dokumentasjonen her: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-secrets-manager/classes/getsecretvaluecommand.html

Jeg bruker Typescript versjon 5.0.2 og Node 18.x som kjøretid, og dette er min tsconfig.json:

{
  "compilerOptions": {
    "module": "NodeNext",
    "target": "ESNext",
    "noImplicitAny": true,
    "preserveConstEnums": true,
    "outDir": "./dist",
    "sourceMap": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}

og dette er koden som feiler:

const client = new SecretsManagerClient({ region: 'my-region' });

async function getExistingSecret(connectionDetails: ConnectionDetails): Promise<string> {
  console.log('checking if secret exists');
  const command = getCommand(connectionDetails);
  console.log(`GetSecretValueCommand: ${JSON.stringify(command)}`);
  return client
    .send(command) // <----- FAILS HERE
    .catch(() => {
      console.log(`secret does not exist`);
      return null;
    })
    .then((response: GetSecretValueCommandOutput) => {
      console.log(`secret exists arn: ${response.ARN}`);
      return response.ARN;
    });
}


const getCommand = (connectionDetails: ConnectionDetails): GetSecretValueCommand => {
  const body = getCommandRequest(connectionDetails);
  console.log(`GetSecretValueRequest: ${JSON.stringify(body)}`);
  return { input: body } as GetSecretValueCommand;
};


const getCommandRequest = (connectionDetails: ConnectionDetails): GetSecretValueCommandInput => {
  return { SecretId: secretName(connectionDetails) } as GetSecretValueCommandInput;
};

Feilen jeg får når jeg kjører denne koden er denne:

TypeError: command.resolveMiddleware is not a function
    at SecretsManagerClient.send (/var/task/node_modules/@aws-sdk/smithy-client/dist-cjs/client.js:13:33)
    at getExistingSecret (/var/task/aws/secrets-client.js:35:10)
    at addSecret (/var/task/aws/secrets-client.js:8:12)
    at Runtime.handler (/var/task/index.js:9:29)
    at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1085:29)

Jeg har sjekket disse stedene sammen med de offisielle dokumentene nevnt ovenfor.

https://github.com/aws/aws-sdk-js-v3/issues/4456

command.resolveMiddleware er ikke en funksjon for AWS SDK når du oppretter AMI fra EC2 instanceID, lurer på hvorfor?

AWS Timestream - SDK V3 Nodejs, TimestreamWriteClient.send() - TypeError: command.resolveMiddleware er ikke en funksjon. Hvordan løse dette?

Takk på forhånd for all hjelp!

Alex

Jeg prøvde å følge dokumentasjonen, og forventet at koden ikke skulle gi denne feilen.

Svar #1

Tusen takk for innspillet ditt i dette; jeg rev meg i håret mens jeg prøvde å finne ut av det. Det viser seg at GetSecretValueCommand ikke skal instansieres som:

const command = { Input: someInput } as GetSecretValueCommand

I stedet bør man bruke den medfølgende konstruktøren:

const command = new GetSecretValueCommand(someInput)

Først da blir objektet korrekt instansiert.

Igjen, mange takk for ditt bidrag på dette!

Merk for de som finner dette: Det ser ut til at dette samme "mønster" er ensartet på tvers av alle JavaScript V3-klienter, så dette bør hjelpe selv om du jobber med Kinesis, S3 osv.

Alex

Svar #2

Slik bruker jeg det med Typescript, men det vil også fungere med Javascript

funksjonsdefinisjon

import { SecretsManagerClient, GetSecretValueCommand, GetSecretValueCommandOutput } from "@aws-sdk/client-secrets-manager";

async function ImportSecrets(secretId?: string): Promise<GetSecretValueCommandOutput> {

    const secretManagerClient = new SecretsManagerClient({ region: region });
    const secretManagerCommand = new GetSecretValueCommand({ SecretId: secretId });

    const secretManagerResponse = await secretManagerClient.send(secretManagerCommand);
    return secretManagerResponse  
}

funksjonskall

let secrets = await ImportSecrets('my-secret-name')

Merk:- Jeg sender hemmelig ID-navn til funksjonen. Selvfølgelig har jeg i mitt tilfelle opprettet hemmeligheten manuelt.

Relaterte artikler