类型为'this'的参数无法赋值给参数类型为'Construct'。

28

我正在尝试将一个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`
    };
};

这里是调用那个函数的“应用”

//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"
    });
  }
}

我遇到的错误是:


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.

最后,我正在使用Node版本v13.3.0

7个回答

25

3
安装了@aws-cdk/aws-lambda后,我遇到了一个错误。我的CDK版本是1.22.0,而最近安装的lambda包是1.23.0。安装相应的lambda 1.22.0后,问题得到解决。 - CCarlos

7
因为安装的 @aws-cdk/aws-lambda@aws-cdk/aws-sns-subscriptions 版本不同,所以我遇到了相同的错误, aws-sns-subscriptions 依赖于相同版本的 aws-lambda。请注意保留 HTML 标签。

enter image description here

当我降低@aws-cdk/aws-lambda版本时,错误消失了!
您也可以更新所有aws-cdk软件包以具有相同的版本。

这解决了我的问题。 - A-Sharabiani
1
请问您能详细说明如何做到这一点吗? - Raghu Ram.k

6

在我的情况下,我使用了cdk init app --language=typescript命令来初始化项目,但是实际上该项目被初始化为旧版本的aws-cdk库。

因此,当我开始使用@aws-cdk 命名空间下的Typescript库时,就会出现以下错误。

所以我不得不将代码中对@aws-cdk/coreStackConstruct等引用全部替换为最新的版本。

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
    }));
  }
}


非常感谢。我简直不敢相信他们会把模板搞成那样。 - serg06

3

将bin/something_cdk.ts文件中的

import * as cdk from 'aws-cdk-lib';

替换为

import * as cdk from '@aws-cdk/core';


2
AWS自己的CDK入门教程有问题。教程视频和说明假设v1依赖关系,但亚马逊提供的测试文件包含v1和v2依赖关系的混合体。您的答案让我正确修复了亚马逊的教程。谢谢! - kookaburra
感觉很棒能够帮忙!!@kookaburra - Rishabh Jain

2
这对我有用:
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as iam from 'aws-cdk-lib/aws-iam';

不要使用:

import * as ec2 from '@aws-cdk/aws-ec2';
import * as iam from '@aws-cdk/aws-iam';

aws-cdk-lib 获取所有模块,因此来自相同的版本。

1
这个问题可以通过简单地忽略'this'错误并继续运行lambda来解决。我认为如果它是一个实际的node/JS程序,它是不会工作的。然而,在使用CDK本地TypeScript时,它会给你很多帮助。

请问您能否分享一下在移除“this”之后所做的内容,因为我也遇到了同样的问题,但是在移除“this”之后出现了lib/cdk-stack.ts:183:52 - error TS2345: Argument of type '"playerlogsBucket"' is not assignable to parameter of type 'Construct'的错误。183行代码如下:const playerlogsBucket = new s3.CfnBucket( "playerlogsBucket", { ~~~~~~~~~~~~~~~~~~ - Ashish Karpe

1

仅仅改变

import * as cdk from "@aws-cdk/core";

import * as apigw from "@aws-cdk/aws-apigateway";

import lambda from "@aws-cdk/aws-lambda"

import dynamodb from "@aws-cdk/aws-dynamodb"

To

const lambda = require ('@aws-cdk/aws-lambda');

const dynamodb= require('@aws-cdk/aws-dynamodb');

const cdk=require('@aws-cdk/core');

const apigw=require('@aws-cdk/aws-apigateway');

有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接