使用猫鼬的异步函数中的返回类型会产生错误

Posted

技术标签:

【中文标题】使用猫鼬的异步函数中的返回类型会产生错误【英文标题】:Return type in asynchronous function using mongoose produces error 【发布时间】:2018-12-11 09:59:20 【问题描述】:

我在尝试编译以下代码时遇到错误:

public getCompanies(): Array<ICompany>
    Company.find(, (err, data)=>
        if (err) console.log(err);
        let companyArray = new Array();
        for (let company of data)
            companyArray.push(company);
        
        return companyArray;
    );

函数的返回类型有错误:error TS2355:声明类型既不是'void'也不是'any'的函数必须返回一个值。

使用 then/catch 函数时遇到了同样的错误。

有没有办法在不将返回类型转换为 any 的情况下完成这项工作?

提前谢谢你

【问题讨论】:

【参考方案1】:

编译器是正确的,你的函数实际上没有返回任何值。

问题是Company.find 需要一个回调,该回调在稍后请求的查询完成时执行。因此,当您调用 getCompanies 时,您在 (err, data)=&gt; 之后编写的所有内容都不会被执行,而您拥有的 return 不是来自 getCompanies 的返回,而是来自稍后执行的匿名函数的返回。

您可以使用类似的方法(传入回调)在查询完成时收到通知:

class foo 
    public getCompanies(onCompleted: (data: ICompany[])=> void): void
        Company.find(, (err, data)=>
            if (err) console.log(err);
            let companyArray = new Array();
            for (let company of data)
                companyArray.push(company);
            
            onCompleted(companyArray);
        );
    

    public usage()
        this.getCompanies(data=> 
        
            console.log(data);
        )
    

或者您可以只返回 find 返回的 DocumentQuery 并使用 thenasync/await 获得结果:

class foo 
    public getCompanies() 
        return Company.find(, (err, data)=>
            if (err) 
                console.log(err);
            
            let companyArray = new Array();
            for (let company of data)
                companyArray.push(company);
            
        );
    
    public async usageAsync()
        let data = await this.getCompanies();
        console.log(data);
    

    public usage()
        this.getCompanies()
            .then (data=> 
            
                console.log(data);
            )
    

【讨论】:

以上是关于使用猫鼬的异步函数中的返回类型会产生错误的主要内容,如果未能解决你的问题,请参考以下文章

带有打字稿的猫鼬,来自猫鼬的错误“连接”

护照和猫鼬的bcrypt错误

本地护照和本地护照猫鼬的身份验证错误

测试时出现“mpromise(猫鼬的默认承诺库)已弃用”错误[重复]

如何在猫鼬的 document.save() 回调中隐藏字段?

如何处理异步。护照和猫鼬的 findOrCreate 方法