Node.js Express环境下Create User函数无法创建用户求助
Node.js + Express 中 Prisma 创建用户失败问题
在Node.js + Express环境开发时,createUser函数无法创建用户。目前能正常从req.body获取firstName和id并打印,但调用prisma.UserInfo.create方法后无法成功创建用户。
相关代码
控制器代码
const { PrismaClient } = require("@prisma/client"); const prisma = new PrismaClient(); module.exports = { async createUser(req, res) { try { const {firstName, id} = req.body console.log({firstName, id}) // 此处能正常打印姓名和ID,但无法创建用户 const user = await prisma.UserInfo.create({ data: { firstName, id } }); return res.json(user) } catch (error) { return res.json({error}) } }, async teste(req, res) { try { return res.json("again") } catch(error) { return res.json({error}) } } }
路由代码
const express = require("express"); const UserController = require("./UserController"); let router = express.Router(); router.post("/user", UserController.createUser); module.exports = router
服务端代码
const express = require('express'); const router = require('./routes.js'); const app = express(); app.use(express.json()) app.use(require("./routes.js")) app.listen(3333, () => { console.log('server at port 3333 is running'); });
Prisma Schema 代码
generator client { provider = "prisma-client-js" } datasource db { provider = "sqlserver" url = env("DATABASE_URL") shadowDatabaseUrl = env("DATABASE_SHADOW_URL") } model UserInfo { id Int @id @default(autoincrement()) firstName String? lastName String? email String @unique password String age Int role String? }
问题分析
从错误信息可知,创建用户时缺少Schema中定义的必填字段:email、password和age。这三个字段在Schema中未标记为可选(无?),因此Prisma要求创建记录时必须提供这些值。
另外,Schema中id字段设置了@default(autoincrement()),如果业务不需要手动传入ID,建议移除手动传参,由数据库自动生成,避免主键冲突。
解决方案
- 补充必填字段:确保请求体包含
email、password、age,并在createUser函数中获取这些参数:
async createUser(req, res) { try { // 获取所有必填字段 const { firstName, email, password, age } = req.body console.log({ firstName, email, age }) // 创建用户时传入所有必填字段 const user = await prisma.UserInfo.create({ data: { firstName, email, password, age } }); return res.json(user) } catch (error) { return res.json({ error: error.message }) } }
- 可选:调整字段可选性:如果某些字段不需要必填,可修改Schema为可选(添加
?),比如:
model UserInfo { id Int @id @default(autoincrement()) firstName String? lastName String? email String? @unique // 标记为可选 password String? age Int? role String? }
注意:此修改需根据实际业务需求决定,且修改后需重新运行npx prisma generate和npx prisma migrate dev更新数据库。
- 移除手动ID传入:若使用自增ID,删除req.body中的
id参数,让数据库自动生成主键。
内容的提问来源于stack exchange,提问作者Matheus Coppi
相关产品推荐
相关产品推荐

