我试图在NodeJS api中使用服务以使我的API易于测试,但是当我注入服务(类)时,它告诉我方法getTasks()不存在。

路线

const TodoService = require('../../services/todo');
const todo = router => {
  router.get('/tasks', async (req, res, next) => {
    try {
      const { message, tasks, status } = await TodoService.getTasks();
      return res.status(201).json({ message, tasks, status });
    } catch (e) {
      return next(e);
    }
  });
};

module.exports = todo;


服务

const TaskModel = require('../models/task');

class TodoService {
  async getTasks() {
    try {
      const tasks = await TaskModel.find();

      return {
        message: 'Fetched posts successfully.',
        tasks: tasks,
        status: 200
      };
    } catch (err) {
      if (!err.statusCode) {
        err.statusCode = 500;
      }
      next(err);
    }
  }
}

module.exports = TodoService;


当我转到http://localhost:3000/api/tasks时,出现此错误:


  TypeError:TodoService.getTasks不是一个函数

最佳答案

getTasksTodoService实例上的一种方法-您尚未创建一个方法,例如new TodoService()

实例化一个实例

await new TodoService().getTasks();


或者,使getTasks static

const TaskModel = require('../models/task');

class TodoService {
  static async getTasks() {
    try {
      const tasks = await TaskModel.find();

      return {
        message: 'Fetched posts successfully.',
        tasks: tasks,
        status: 200
      };
    } catch (err) {
      if (!err.statusCode) {
        err.statusCode = 500;
      }
      next(err);
    }
  }
}

module.exports = TodoService;


或考虑到TodoService看起来甚至不应该实例化的事实,这就是我要使用显示的代码来实现的方式,请将TodoService变成一个简单的Object

const TaskModel = require('../models/task');

const TodoService = {
  async getTasks() {
    try {
      const tasks = await TaskModel.find();

      return {
        message: 'Fetched posts successfully.',
        tasks: tasks,
        status: 200
      };
    } catch (err) {
      if (!err.statusCode) {
        err.statusCode = 500;
      }
      next(err);
    }
  }
}

module.exports = TodoService;

关于javascript - TypeError XXX不是NodeJS中的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58071436/

10-11 09:06