首页 > 解决方案 > TypeError XXX 不是 NodeJS 中的函数

问题描述

我正在尝试在我的 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 不是函数

标签: javascriptnode.js

解决方案


getTasks是一个实例TodoService上的方法 - 你还没有创建一个,即喜欢new TodoService()

要么实例化一个实例

await new TodoService().getTasks();

或者,使 getTasksstatic

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 成为一个简单的对象

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;

推荐阅读