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验证失败' }
解决方案
修复路由映射错误
router.js中错误地将nftData导入为nftIds模块,导致调用GET /nftdata时执行的是创建数据的逻辑,而非读取数据的nftData.js。修改导入语句:// 原错误代码 const nftData = require('../controller/nftIds'); // 修改为 const nftData = require('../controller/nftData');检查nftIds.js逻辑
错误栈显示错误发生在nftIds.js第32行,说明该文件中可能存在创建文档的代码,但未传入必填字段。如果该文件处理数据插入,需确保前端传入的所有必填字段都被正确接收并传入Mongoose的create方法。优化前端useEffect调用
前端useEffect未设置依赖数组,会导致组件每次渲染都重复调用fetchingData,添加空依赖数组避免无限请求:useEffect(()=>{ fetchingData(); }, []) // 添加空数组作为依赖可选:修正模型命名
Schema中模型名为"contacts",与NFT业务不符,建议改为"NFT":module.exports = mongoose.model("NFT", ids);同时更新nftData.js中的模型导入路径和名称,确保对应一致。
内容的提问来源于stack exchange,提问作者gauthami vijay
相关产品推荐
相关产品推荐

