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

如何通过Express与NextJS正确保存Mongoose数据?仅存_id问题排查

问题:NextJS+Express+Mongoose 仅保存_id字段,其他字段为空的原因及解决办法

出现这个问题主要有两个核心原因:

1. 表单字段名与后端接收字段完全不匹配

你的NextJS表单里,姓名输入框的name属性是first,邮箱输入框的name属性是last,但Express后端代码里却尝试读取req.body.name和req.body.email——两者完全对应不上,导致后端根本拿不到表单提交的姓名和邮箱数据,自然只会存入默认的_id字段。

2. Express未配置表单数据解析中间件

默认情况下,Express不会自动解析application/x-www-form-urlencoded格式的表单数据(这是HTML表单默认的提交格式),如果没添加解析中间件,req.body会是空对象,即使字段名匹配也拿不到数据。


修正后的代码示例:

NextJS 表单代码(修正字段名)

const Home: NextPage = () => {
  return (
    <div className={styles.container}>
      <form action="http://localhost:2000/register" method="post">
        <label htmlFor="name">Name:</label>
        {/* 把name属性改为name,id与label的for属性对应 */}
        <input type="text" id="name" name="name" />
        <label htmlFor="email">Email</label>
        {/* 把name属性改为email,同时type设为email更规范 */}
        <input type="email" id="email" name="email" />
        <button type="submit">Submit</button>
      </form>
    </div>
  )
}

Express 配置与路由代码(添加解析中间件)

首先在Express的主入口文件(比如app.js)中添加表单解析中间件:

const express = require('express');
const app = express();

// 解析urlencoded格式的表单数据
app.use(express.urlencoded({ extended: true }));
// 若需要处理JSON格式请求,可额外添加以下代码
app.use(express.json());

// 挂载路由
const registerRouter = require('./routes/register');
app.use('/', registerRouter);

路由代码保持逻辑不变(现在字段名已匹配):

router.post('/register', async (req, res) => {
    const user = await User.create({
        name: req.body.name,
        email: req.body.email,
    });
    return res.status(200).json(user);
});

Mongoose Schema 代码(无需修改)

import mongoose from 'mongoose'

const userSchema = new mongoose.Schema({
    name: String,
    email: String,
});

export const User = mongoose.model('User', userSchema);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:36:06