快速获取路由返回错误 500:"Cast to ObjectId failed for value"



我需要一些帮助,请,我尝试种子一些数据到mongoDB Atlas,所以我的代码(感谢Basir^^)一个api:

productRouter.get('/seed', expressAsyncHandler(async (req, res) => {
console.log('foo');
/*     await Product.remove({})*/
const seller = await User.findOne({
isSeller: true
})
if (seller) {
const products = data.products.map((product) => ({
...product,
seller: seller._id,
}));
const createdProducts = await Product.insertMany(data.products);
res.send({
createdProducts
});
} else {
res.status(500).send({
message: 'No seller found. first run /api/users/seed'
});
}}));

问题,当我在浏览器中输入我的API路由时,他返回这个:

"Cast to ObjectId failed for value "seed" at path 
"_id" for model "Product""

其他路线运行良好,我真的很困惑…

是productSchema:

import mongoose from 'mongoose'
import {
reviewSchema
} from './reviewSchema.js'
const productSchema = new mongoose.Schema({
name: {
type: String,
required: true,
unique: true
},
seller: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
},
image: {
type: String,
required: true,
},
brand: {
type: String,
required: true,
},
category: {
type: String,
required: true,
},
description: {
type: String,
required: true,
},
price: {
type: Number,
required: true,
},
countInStock: {
type: Number,
required: true,
},
rating: {
type: Number,
required: true,
},
numReviews: {
type: Number,
required: true,
},
reviews: [reviewSchema]
}, {
timestamps: true
})
export const Product = mongoose.model("Product", 
productSchema)

this my server.js:

import {config} from 'dotenv'
import express from 'express'
import mongoose from 'mongoose'
import path from 'path'
import{productRouter}
from'./routers/productRouter.js';
import {userRouter} from './routers/userRouter.js'
import {orderRouter} from './routers/orderRouter.js'
import {uploadRouter} from 
'./routers/uploadRouter.js';
const dotenv = config();
const app = express();
app.use(express.json());
app.use(express.urlencoded({
extended: true
}));
mongoose.connect(process.env.MONGODB_URL || 
'mongodb://localhost/ecommercelab', {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
});
app.use('/api/uploads', uploadRouter);
app.use('/api/users', userRouter);
app.use('/api/products', productRouter);
app.use('/api/orders', orderRouter);
app.get('/api/config/paypal', (req, res) => {
res.send(process.env.PAYPAL_CLIENT_ID || '');
});
app.get('/api/config/google', (req, res) => {
res.send(process.env.GOOGLE_API_KEY || '');
});
const __dirname = path.resolve()
app.use('/uploads', 
express.static(path.join(__dirname, 'uploads')));
app.use(express.static(path.join(__dirname, 
'/frontend/build')));
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 
'/frontend/build/index.html'));
});
app.use((err, req, res, next) => {
res.status(500).send({
message: err.message
});
});
const port = process.env.PORT || 5000;
app.listen(port, () => {
console.log(`Serve at http://localhost:${port}`);
});

这是一个电子商务应用程序。

谢谢你的关注,我继续在我这边测试;)

好的,经过三个小时的尝试,我终于解决了这个问题,我发现了光^^。只是,我的路由(/seed)被定位在带有/:id的路由后面,似乎它产生了一种冲突,我将她移动到文件productRouter中更高的位置,现在ok了。:)

我的猜测是你应该用const createdProducts = await Product.insertMany(products);代替const createdProducts = await Product.insertMany(data.products);。您引用的是data.products,但在您使用const products = data.products.map( ...之前的几行

编辑:这只会解决您的数据库中缺少产品条目的sellerid的传入问题:D

相关内容