“this”类型的参数不可分配给参数“Construct”

aro*_*roe 9 node.js aws-cdk

我试图将一个 lambda 函数调用到一个“示例应用程序”堆栈中,它给我一个错误,因为我试图将一个“this”参数传递给它。

这是我的 lambda 函数

export async function handler(event) {
    console.log("request:", JSON.stringify(event, undefined, 2));
    return {
        statusCode: 200,
        headers: { "Content-Type": "text/plain" },
        body: `Hello, CDK! You've hit ${event.path}\n`
    };
};

Run Code Online (Sandbox Code Playgroud)

这是调用该函数的“应用程序”

//import sns = require('@aws-cdk/aws-sns');
//import subs = require('@aws-cdk/aws-sns-subscriptions');
//import sqs = require('@aws-cdk/aws-sqs');
import cdk = require('@aws-cdk/core');
import lambda = require('@aws-cdk/aws-lambda');

//Exports class from other file much like a function

export class CdkWorkshopStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { 
    super(scope, id, props);

    // Describes an AWSLambda Resource
    const hello = new lambda.Function (this, 'HelloHandler', {
      runtime: lambda.Runtime.NODEJS_8_10,    //execution environment
      code: lambda.Code.asset('lambda'),   // code loaded from the "lambda" directory
      handler: 'hello.handler'                // file is "hello", function is "handler"
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:


lib/cdk-workshop-stack.ts:31:39 - error TS2345: Argument of type 'this' is not assignable to parameter of type 'Construct'.
  Type 'CdkWorkshopStack' is not assignable to type 'Construct'.
    Types of property 'node' are incompatible.
      Type 'import("/Users/aroe/cdk-workshop/node_modules/@aws-cdk/core/lib/construct").ConstructNode' is not assignable to type 'import("/Users/aroe/cdk-workshop/node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/core/lib/construct").ConstructNode'.
        Types have separate declarations of a private property 'host'.

31     const hello = new lambda.Function(this, 'HelloHandler', {
                                         ~~~~

[1:24:08 PM] Found 1 error. Watching for file changes.

Run Code Online (Sandbox Code Playgroud)

最后我使用的是 Node 版本 v13.3.0

Cha*_*ton 9

构造定义在我看来是正确的。如果各种 cdk 模块的版本不同,就会发生该错误;请参阅“this”类型的参数不可分配给“Construct”类型的参数,以获取其中一个示例。尝试运行npm update;看看是否能解决问题。

  • 安装 @aws-cdk/aws-lambda 后出现错误。我的CDK版本是1.22.0,而最近安装的lambda包是1.23.0 安装相应的lambda 1.22.0后,问题得到解决 (3认同)

Aya*_*ama 7

@aws-cdk/aws-lambda我遇到了同样的错误,因为和 的安装版本@aws-cdk/aws-sns-subscriptions不同,

whileaws-sns-subscriptions依赖于aws-lambda同一版本。

在此输入图像描述

当我降级@aws-cdk/aws-lambda版本时,错误消失了!

您还可以更新所有aws-cdk软件包以具有相同的版本。


Dyl*_*rce 7

就我而言,即使我使用了cdk init app --language=typescript由旧遗留aws-cdk库引导的项目。

因此,当我开始使用@aws-cdk命名空间包中的 Typescript 库时,我收到了此错误。

所以我必须替换所有对StackConstruct等的引用@aws-cdk/core

import * as cdk from '@aws-cdk/core';
import * as sqs from '@aws-cdk/aws-sqs';
import * as lambda from '@aws-cdk/aws-lambda'
import { SqsEventSource } from '@aws-cdk/aws-lambda-event-sources';

export class WorkerCdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // example resource
    const queue = new sqs.Queue(this, 'WorkerQueue', {
      queueName: 'WorkerQueue',
    });

    // processor function
    const processor = new lambda.Function(this, 'QueueProcessor', {
      code: lambda.Code.fromAsset('lambda'),
      handler: 'processor.handler',
      functionName: 'QueueProcessor',
      runtime: lambda.Runtime.NODEJS_12_X,
    });

    // map processor to queue
    processor.addEventSource(new SqsEventSource(queue, {
      batchSize: 10, // default
      reportBatchItemFailures: true, // default to false
    }));
  }
}

Run Code Online (Sandbox Code Playgroud)