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

Node.js从MongoDB读取NFT数据触发Mongoose验证错误求助

Mongoose验证错误排查:读取NFT数据时必填字段缺失

问题描述

已将前端React传来的NFT数据存入MongoDB,但调用/api/nftdata接口读取数据时,触发Mongoose验证错误,提示id、name、description、imageUrl、price等必填字段缺失。

前端代码

import React, { useEffect } from "react";
import axios from "axios";

export default function marketPlace(){

    useEffect(()=>{
        fetchingData();
    })

    const fetchingData = ()=>{
        axios.get("http://localhost:4040/api/nftdata")
        .then(res=>{
            console.log(res)
        })
        .catch(err=>{
            console.log(err)
        })
    }

    return(
        <div>
            Market Place
        </div>
    )
}

后端代码

index.js

var express = require("express");
var app = express()
var cors = require("cors");
var bodyparser = require("body-parser");
var router = require('./router/router');
const connectDB = require('./db/db');

require('./sevice/transactionChecker')(app);
connectDB();

var PORT = 4040

app.use(cors());
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({extended:false}));

app.use('/api', router);

app.listen(PORT,()=>{
    console.log(`监听端口 ${PORT}`)
})

module.exports = app;

router.js

var express = require("express")
var router = express.Router();

const aadiTransaction = require('../controller/aadiTransaction');
const nftIds = require('../controller/nftIds');
const nftData = require('../controller/nftIds'); // 此处存在错误!
const ids = require('../controller/nftdata');

router.get("/", (req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.json({
    code: 200,
    dismsg: "Api 运行中...",
  });
});

router.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });

router.post('/ids', nftIds)
router.get('/inserttrans/:coinpair/:tx/:tokencount', aadiTransaction)
router.get('/nftdata', nftData) // 此处调用的是nftIds的函数,而非读取数据的nftData

module.exports = router;

Schema定义

const mongoose = require("mongoose");

const ids =  new mongoose.Schema(
   {
    id: {
        type: String,
        required: true
    },
    name:{
        type:String,
        required: true
    },
    description:{
        type:String,
        required: true
    },
    imageUrl:{
        type: String,
        required: true
    },
    price:{
        type: Number,
        required: true
    },
    videoUrl:{
        type: String
        
    }
   } 
)

module.exports = mongoose.model("contacts", ids); // 模型命名建议改为"NFT",更贴合业务场景

读取逻辑代码(nftData.js)

const mongoose = require('mongoose')
require('dotenv').config()

const ids = require('../modals/nftId')

const nftData = async(req,res)=>{
    
    await ids.find({})
    .then((data)=>{
        console.log(data)
        res.json(data)
    })
    .catch((err)=>{
        console.log(err)
    })
}

module.exports = nftData;

错误信息

Error: contacts验证失败: id: Path `id`是必填项., name: Path `name`是必填项., description: Path `description`是必填项., imageUrl: Path `imageUrl`是必填项., price: Path `price`是必填项.
    at ValidationError.inspect (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\error\validation.js:50:26)  
    at formatValue (node:internal/util/inspect:806:19)
    at inspect (node:internal/util/inspect:365:10)
    at formatWithOptionsInternal (node:internal/util/inspect:2292:40)
    at formatWithOptions (node:internal/util/inspect:2154:10)    
    at console.value (node:internal/console/constructor:339:14)  
    at console.log (node:internal/console/constructor:376:61)    
    at C:\Users\gauth\OneDrive\Desktop\mint\server\controller\nftIds.js:32:13
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  errors: {
    id: ValidatorError: Path `id`是必填项.
        at validate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1346:13)
        at SchemaString.SchemaType.doValidate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1330:7)
        at C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\document.js:2903:18
        at processTicksAndRejections (node:internal/process/task_queues:78:11) {
      properties: [Object],
      kind: 'required',
      path: 'id',
      value: undefined,
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    },
    name: ValidatorError: Path `name`是必填项.
        at validate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1346:13)
        at SchemaString.SchemaType.doValidate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1330:7)
        at C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\document.js:2903:18
        at processTicksAndRejections (node:internal/process/task_queues:78:11) {
      properties: [Object],
      kind: 'required',
      path: 'name',
      value: undefined,
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    },
    description: ValidatorError: Path `description`是必填项. 
        at validate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1346:13)
        at SchemaString.SchemaType.doValidate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1330:7)
        at C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\document.js:2903:18
        at processTicksAndRejections (node:internal/process/task_queues:78:11) {
      properties: [Object],
      kind: 'required',
      path: 'description',
      value: undefined,
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    },
    imageUrl: ValidatorError: Path `imageUrl`是必填项.       
        at validate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1346:13)
        at SchemaString.SchemaType.doValidate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1330:7)
        at C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\document.js:2903:18
        at processTicksAndRejections (node:internal/process/task_queues:78:11) {
      properties: [Object],
      kind: 'required',
      path: 'imageUrl',
      value: undefined,
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    },
    price: ValidatorError: Path `price`是必填项.
        at validate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1346:13)
        at SchemaNumber.SchemaType.doValidate (C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\schematype.js:1330:7)
        at C:\Users\gauth\OneDrive\Desktop\mint\server\node_modules\mongoose\lib\document.js:2903:18
        at processTicksAndRejections (node:internal/process/task_queues:78:11) {
      properties: [Object],
      kind: 'required',
      path: 'price',
      value: undefined,
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    }
  },
  _message: 'contacts验证失败'
}

解决方案

  1. 修复路由映射错误
    router.js中错误地将nftData导入为nftIds模块,导致调用GET /nftdata时执行的是创建数据的逻辑,而非读取数据的nftData.js。修改导入语句:

    // 原错误代码
    const nftData = require('../controller/nftIds');
    // 修改为
    const nftData = require('../controller/nftData');
    
  2. 检查nftIds.js逻辑
    错误栈显示错误发生在nftIds.js第32行,说明该文件中可能存在创建文档的代码,但未传入必填字段。如果该文件处理数据插入,需确保前端传入的所有必填字段都被正确接收并传入Mongoose的create方法。

  3. 优化前端useEffect调用
    前端useEffect未设置依赖数组,会导致组件每次渲染都重复调用fetchingData,添加空依赖数组避免无限请求:

    useEffect(()=>{
        fetchingData();
    }, []) // 添加空数组作为依赖
    
  4. 可选:修正模型命名
    Schema中模型名为"contacts",与NFT业务不符,建议改为"NFT":

    module.exports = mongoose.model("NFT", ids);
    

    同时更新nftData.js中的模型导入路径和名称,确保对应一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:15:48