0

我目前正在尝试向我的 NodeJS 项目添加一个服务层,这是我使用 express 和 sequelize 构建的一个简单 API。该项目具有通常的模型、路由和控制器(MRC)形式的结构;每个都有自己的目录。现在我需要做的就是添加另一个包含服务文件的目录。这些文件将以类的形式包含业务逻辑,我将导出并包含在我的控制器文件中。

在这里,我将显示控制器和服务文件:

爆发控制器.js

const EruptionService = require('../services/eruptionService.js');
let Eruption = new EruptionService()


module.exports = {
    getEruptions: (req, res) => {
        Eruption.get().then(result => {
            return res.status(200).json({
                message: "Get All Eruptions",
                result
            })
        }).catch(err => {
            return res.status(200).json({
                message: "internal Server Error",
                error: err.message
            })
        })
    }
};

爆发服务.js

const { eruption } = require('../models');

class EruptionService {
    constructor () {
        this.eruptionModel = eruption;
        
    }

    get () {
        this.eruptionModel.findAll()
        .then(result => result)
        .catch(err => err)
    }
}

module.exports = EruptionService;

正如我们在这里看到的,在服务文件中,我eruption从模型文件夹中导入了模型并将其包含在构造函数中。然后我创建了一个名为 的方法get,用于从数据库中检索所有喷发数据。

之后,我将该EruptionService类导入到控制器文件中,将其作为实例启动,并将该类包含在getEruptions函数中。然后,该函数将以端点的形式在快速路由中使用。

问题是当我尝试向端点发送请求时,出现以下错误

TypeError: Cannot read property 'then' of undefined

根据错误,似乎EruptionService该类没有正确导出,因为当我调用它时get它是未定义的。

我已经被这个问题困扰了一段时间,我不确定发生了什么。根据这篇文章,我似乎正确地导出了课程。

我也尝试过以如下方式导出

module.exports = {EruptionService: EruptionService}

而且我也尝试过像

const EruptionService = require('../services/eruptionService.js');

但最终,它要么导致相同的错误,要么导致不同的一种错误。我想知道是否有人能指出我错过了什么?提前致谢

4

1 回答 1

1

您应该返回一个 promise 函数,以便在其中获取 then 函数。您的服务中存在问题,应该类似于以下代码段

 class EruptionService {
    constructor () {
        this.eruptionModel = eruption;
        
    }

    get () {
        return this.eruptionModel.findAll()
    }
}
于 2020-08-30T17:26:03.330 回答