You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js+Prisma开发中TypeError: createProject is not a function问题求助

问题:调用创建项目接口时抛出TypeError: createProject is not a function错误

应用基于React.js和Prisma开发,启动正常,但调用创建项目接口时始终报错:

TypeError: createProject is not a function

错误原因分析

  1. Service层导出与调用不匹配:projectService.js导出的是Project类,而非直接导出createProject函数,但projectMiddleware.js和projectController.js都尝试直接调用createProject或projectService.createProject,该类既没有导出该函数,也未实例化类来调用其方法。
  2. 方法命名不一致:Project类中创建项目的方法名为大写开头的Create,但调用时使用的是小写的createProject,命名不匹配。
  3. 方法参数格式不兼容:Project类的Create方法接收多个独立参数,但调用时传入的是req.body对象,参数格式不匹配。

修复步骤

步骤1:调整Service层的方法命名与参数格式

修改projectService.js中的Create方法,将其重命名为createProject并改为接收对象参数(适配req.body的传入方式):

// projectService.js
class Project {
    // 重命名方法并改为接收对象参数
    async createProject({ title, description, projectType, coleaderId, ownerId }) {
        try {
            const project = await prisma.project.create({
                data: {
                    id: uuid(),
                    title,
                    description,
                    projectType,
                    coleaderId,
                    ownerId
                }
            })
            return project
        } catch (error) {
            throw new Error('Error creating project')
        }
    }
    // 其他方法保持不变
}

步骤2:修改Service层的导出方式

在projectService.js末尾,实例化Project类并导出实例,这样其他文件可以直接调用实例上的方法:

// projectService.js末尾
const projectServiceInstance = new Project();
module.exports = projectServiceInstance;

步骤3:修复Middleware层的调用

修改projectMiddleware.js,正确导入Service实例并调用createProject方法:

// projectMiddleware.js
const projectService = require('../services/projectService');

async function createProjectMiddleware(req, res, next) {
  try {
    // 直接传入req.body对象,匹配service方法的参数格式
    const project = await projectService.createProject(req.body);
    res.locals.project = project;
    next();
  } catch (error) {
    next(error);
  }
}

module.exports = {
  createProjectMiddleware,
};

步骤4:修复Controller层的错误

修改projectController.js中的错误:

// projectController.js
const projectService = require('../services/projectService')
const { validationResult } = require('express-validator'); // 补充导入validationResult

async function createProject(req, res) {
  const project = await projectService.createProject(req.body)
  res.json(project)
}

const GetProjectbyID = async (req, res) => {
  const { id } = req.params
  const errors = validationResult(req)

  if (!errors.isEmpty()) {
      return res.status(400).json({
          error: errors.errors[0].msg,
      })
  }

  try {
      // 替换未定义的User为projectService,调用getProject方法
      const result = await projectService.getProject(id)
      res.send(result)
  } catch (err) {
      const date = new Date()
      if (err.message) {
          console.log(`[${date.getDate()}-${date.getUTCMonth()+1}-${date.getFullYear()} | ${date.getHours()-3}:${date.getMinutes()}]`,err.message)
      }
      res.status(500).send(err.message)
  }
}

module.exports = {
  createProject,
  GetProjectbyID,
}

步骤5:(可选)调整路由与Controller的关联

如果需要使用Controller中的createProject方法,修改projectRoutes.js:

// projectRoutes.js
const express = require('express');
const router = express.Router();
const { createProjectMiddleware } = require('../middlewares/projectMiddleware');
const { createProject } = require('../controllers/projectController'); // 导入Controller方法

router.post('/projects', createProjectMiddleware, createProject); // 或者直接使用Controller方法

module.exports = router;

完成以上修改后,重启服务,调用创建项目接口即可正常工作。

内容的提问来源于stack exchange,提问作者Stefano Tinelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:37:47