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

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,建议移除手动传参,由数据库自动生成,避免主键冲突。

解决方案

  1. 补充必填字段:确保请求体包含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 })
    }
}
  1. 可选:调整字段可选性:如果某些字段不需要必填,可修改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更新数据库。

  1. 移除手动ID传入:若使用自增ID,删除req.body中的id参数,让数据库自动生成主键。

内容的提问来源于stack exchange,提问作者Matheus Coppi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:45:27