【问题标题】:connect ECONNREFUSED 127.0.0.1:443. Then method executes before the preceding method completes execution连接 ECONNREFUSED 127.0.0.1:443。 then 方法在前面的方法完成执行之前执行
【发布时间】:2021-01-06 19:01:50
【问题描述】:

我正在尝试将项目放入本地 dynamodb。我尝试记录以检查问题出在哪里,其中一个问题是,或者可能是在前面的方法完成执行之前正在执行 then 方法。下面是调用addCompany method in another classController类代码

1:Controller 类中的 registerCompany() 方法

public async registerCompany(data, TableName) : Promise <HttpResponse>{

    return new Promise((resolve, reject) => {
        this.registerCompanyService = new RegisterCompanyService();
        let companydata =   this.registerCompanyService.addCompany(data,TableName).then(result =>{ //then is being executed before the addCompany finishes its execution
            if(!result){
                console.log("All data not provided")
                return reject(this.createBadRequestResponse())
            }
            console.log(`The type of return data is ${typeof result}`)
            resolve();

        });

        if(companydata!=null)
        {
            console.log(`The company data is ------> ${companydata}`)
            return  this.createSuccessResponse(companydata);
        }
        else {
           return this.createInternalServerErrorResponse();
        }
    })
}

2:CompanyService 类中的 addCompany() 方法

public async addCompany(companyData: Company, TableName): Promise < any > {
    this.companyDao = new CompanyDao();
    var params = {
        TableName,
        Item: {
            key1: companyData.key1,
            key2: companyData.key2,
            key3: companyData.key3,
        }
    }

    console.log(`The params stringified before sending to dao are -------> ${JSON.stringify(params)}`);

    this.companyDao.addCompany(params);

}

3:DAO 类中的 addCompany() 方法将数据插入 DB

public async addCompany(params): Promise < any > {

        console.log(`Inside DAO params-------> ${params.item}`);

        let putItem = new Promise < any > ((resolve, reject) => {

            this.dynamodbClient.put(params, (error, result) => {
                console.log(`Inside put     params --------> ${params.item}`)
                if (error) {
                    console.error(`Unable to add item. Error ---> ${JSON.stringify(error)}`)
                    reject(error);
                } else {
                    console.log(`Added Item -----> ${params.Item}`)
                    resolve(true)
                }
            })
        })

        const result = await putItem;
        console.log(`This is the final result -------->${result}`);
        return result;

【问题讨论】:

    标签: javascript node.js lambda types amazon-dynamodb


    【解决方案1】:

    public async addCompany(companyData: Company, TableName): Promise < any > {
        this.companyDao = new CompanyDao();
        var params = {
            TableName,
            Item: {
                key1: companyData.key1,
                key2: companyData.key2,
                key3: companyData.key3,
            }
        }
    
        console.log(`The params stringified before sending to dao are -------> ${JSON.stringify(params)}`);
    
        //When calling a promise you either return it or wait for its completion using await.
        await this.companyDao.addCompany(params);
        //OR return it
        return this.companyDao.addCompany(params);
    }

    您实际上是在进行异步调用,但不是将 Promise 从 DAO 类返回到控制器。因此,调用方法实际上无法知道来自 DAO 的 addCompany 是否已解析。此外,即使它们位于不同的类/服务中,也要避免使用相同的方法名称。

    我不能 100% 确定您的 addCompany(DAO) 方法。祝你好运;)

    【讨论】:

    • 谢谢。您的解决方案适用于该课程。我现在正在研究 DAO。弄清楚为什么它没有等待put 方法完成其执行,然后才返回Controller 类。
    • 您可以将您的 put 方法转换为一个 Promise,并且应该直接返回它,除非您需要对您的数据进行一些调整。不要忘记提及ReturnValues。我对aws不是很熟悉,但我认为你的最后一个问题可以用这个SO问题来解决:Put object and promise
    • 太棒了!像魅力一样工作!!!非常感谢。将put 转换为promise 工作
    猜你喜欢
    • 2019-02-22
    • 2017-06-07
    • 1970-01-01
    • 2020-12-07
    • 2015-08-10
    • 1970-01-01
    • 2018-06-01
    • 2013-08-09
    • 2018-02-08
    相关资源
    最近更新 更多