猫鼬 const castError = new CastError();

Mongoose const castError = new CastError();

我似乎遇到了这个错误:

C:\...\node_modules\mongoose\lib\query.js:4638
  const castError = new CastError();
                    ^

CastError: Cast to ObjectId failed for value "undefined" (type string) at path "_id" for model "cProd"
    at model.Query.exec (C:\...\node_modules\mongoose\lib\query.js:4638:21)
    at model.Query.Query.then (C:\...\node_modules\mongoose\lib\query.js:4737:15)
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  messageFormat: undefined,
  stringValue: '"undefined"',
  kind: 'ObjectId',
  value: 'undefined',
  path: '_id',
  reason: BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters
      at new BSONTypeError (C:\...\node_modules\bson\lib\error.js:41:28)
      at new ObjectId (C:\...\node_modules\bson\lib\objectid.js:65:23)
      at castObjectId (C:\...\node_modules\mongoose\lib\cast\objectid.js:24:12)
      at ObjectId.cast (C:\...\node_modules\mongoose\lib\schema\objectid.js:247:12)
      at ObjectId.SchemaType.applySetters (C:\...\node_modules\mongoose\lib\schematype.js:1180:12)
      at ObjectId.SchemaType._castForQuery (C:\...\node_modules\mongoose\lib\schematype.js:1615:15)
      at ObjectId.SchemaType.castForQuery (C:\...\node_modules\mongoose\lib\schematype.js:1605:15)
      at ObjectId.SchemaType.castForQueryWrapper (C:\...\node_modules\mongoose\lib\schematype.js:1582:20)
      at cast (C:\...\node_modules\mongoose\lib\cast.js:341:32)
      at model.Query.Query.cast (C:\...\node_modules\mongoose\lib\query.js:5073:12),
  valueType: 'string'
}

对于此代码:

const express = require('express');
const path = require('path');
const mongoose = require('mongoose');
const cProd = require('./models/cProd');

mongoose.connect('mongodb://localhost:#/database', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
  console.log('Database connected');
});

const app = express();

// app.engine('ejs', ejsMate)
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'))

// Parsing request.body

app.use(express.urlencoded({extended: true}))

app.get('/', (req, res) => {
    res.render('main')
});

app.get('/cProds', async (req, res) => {
    const cProds = await cProd.find({});
    res.render('cProds/index', {cProds})
});

app.get('/cProds/create', (req, res) => {
    res.render('cProds/create');
})

app.post('/cProds', async (req, res) => {
    const conProd = new cProd(req.body.cProd);
    await conProd.save();
    res.redirect(`/cProds/${cProd._id}`)
});

app.get('/cProds/:id', async (req, res) => {
    const conProd = await cProd.findById(req.params.id)
    res.render('cProds/show', {conProd})
});

app.listen(3000, () => {
    console.log('Serving on port #')
})

当我执行简单的 res.send(req.body) 时,上面的 app.post 似乎有效,但如果我完成代码,我会收到此错误。

小白问题,可能是因为没有安装UUID?我不相信我还没有。

请帮助 - 这里完全是新手,已经用尽研究并弄清楚了这一点。

更新:架构和模型

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const opts = {toJSON:{virtuals:true}};

const CProdSchema = new Schema({
    product_name: String,
    type: String,
    description: String
}, opts);

CProdSchema.virtual('properties.popUpMarkup').get(function() {
    return `
    <strong><a href="/campgrounds/${this._id}">${this.product_name}</a></strong>
    <p>${this.description.substring(0,20)}...</p>`
});

module.exports = mongoose.model('cProd', CProdSchema)

啊,我好像瞎了

你的问题方法:

app.post('/cProds', async (req, res) => {
    const conProd = new cProd(req.body.cProd);
    await conProd.save();
    res.redirect(`/cProds/${cProd._id}`)
});

您想将用户发送到新创建的 cProd 的 url。但是 cProd 是模型名称,而 conProd 是创建的新文档。 只需更改最后一行:

    res.redirect(`/cProds/${conProd._id}`)

为了避免将来造成混淆,我建议坚持使用模型的首字母大写。我在猜测这个名字,例如:

const CampgroundProduct = require('./models/cProd');

并且此模型的任何实例(文档)都可以称为 campgroundProduct 或简称为 product

至于具体的错误代码是如何发生的,我猜测 model._id 引用了该类型字段的创建者,即 mongoose.Types.ObjectId()