猫鼬 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()
我似乎遇到了这个错误:
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()