React.js+Prisma开发中TypeError: createProject is not a function问题求助
问题:调用创建项目接口时抛出
TypeError: createProject is not a function错误 应用基于React.js和Prisma开发,启动正常,但调用创建项目接口时始终报错:
TypeError: createProject is not a function
错误原因分析
- Service层导出与调用不匹配:
projectService.js导出的是Project类,而非直接导出createProject函数,但projectMiddleware.js和projectController.js都尝试直接调用createProject或projectService.createProject,该类既没有导出该函数,也未实例化类来调用其方法。 - 方法命名不一致:
Project类中创建项目的方法名为大写开头的Create,但调用时使用的是小写的createProject,命名不匹配。 - 方法参数格式不兼容:
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
相关产品推荐
相关产品推荐

