使用Prisma+MongoDB+NextJS发送POST请求时遇未定义属性读取错误
问题原因
- createTask出错时无返回值:当
createTask函数捕获到错误时,仅打印错误但未返回任何值,导致API中的taskResponse变为undefined,此时访问taskResponse.error就会触发Cannot read properties of undefined (reading 'error')错误。 - 返回值键名不匹配:
createTask成功时返回{task: createdTask},但API中尝试读取taskResponse.createdTask,这会导致返回的createdTask为undefined。
修正方案
1. 修复createTask函数
调整函数返回值,确保成功和失败时都返回结构一致的对象:
export const createTask = async (task) => { try { const createdTask = await prisma.tasks.create({ data: task }); // 统一返回键名为createdTask,匹配API中的读取逻辑 return { createdTask }; } catch (error) { console.error('Error creating task:', error); // 捕获错误后返回包含error属性的对象 return { error: error.message }; } };
2. 修正API路由逻辑
完善请求处理逻辑,添加基础校验并正确处理返回值:
if (req.method === 'POST') { try { const data = req.body; // 基础校验:确保请求体不为空 if (!data) { return res.status(400).json({ error: '请求体不能为空' }); } const taskResponse = await createTask(data); if (taskResponse.error) { throw new Error(taskResponse.error); } return res.status(201).json({ createdTask: taskResponse.createdTask }); } catch (error) { res.status(500).json({ error: error.message }); } } else { // 处理非POST请求 res.setHeader('Allow', ['POST']); res.status(405).end(`Method ${req.method} Not Allowed`); }
额外检查项
- 确保Prisma客户端已正确初始化(通常在
lib/prisma.js类文件中导出实例,并在createTask中正确导入); - 使用Postman请求时,需设置请求头为
Content-Type: application/json,且请求体为合法JSON格式,字段与Prisma schema中tasks模型匹配; - 确认MongoDB连接正常,已执行
prisma generate和prisma db push/prisma migrate dev完成schema同步。
内容的提问来源于stack exchange,提问作者Sanket Shinde
相关产品推荐
相关产品推荐

