Error()
Error.CastError
Error.DivergentArrayError
Error.DocumentNotFoundError
Error.MissingSchemaError
Error.MongooseServerSelectionError
Error.OverwriteModelError
Error.ParallelSaveError
Error.StrictModeError
Error.StrictPopulateError
Error.ValidationError
Error.ValidatorError
Error.VersionError
Error.messages
Error.prototype.name
Error()
Parameters:
msg
«String» Error message
Type:
- «constructor»
Inherits:
- «Error»
MongooseError constructor. MongooseError is the base class for all
Mongoose-specific errors.
Example:
const Model = mongoose.model('Test', new mongoose.Schema({ answer: Number }));
const doc = new Model({ answer: 'not a number' });
const err = doc.validateSync();
err instanceof mongoose.Error.ValidationError; // true
Error.CastError
Type:
- «property»
An instance of this error class will be returned when mongoose failed to
cast a value.
Error.DivergentArrayError
Type:
- «property»
An instance of this error will be returned if you used an array projection
and then modified the array in an unsafe way.
Error.DocumentNotFoundError
Type:
- «property»
An instance of this error class will be returned when save()
fails
because the underlying
document was not found. The constructor takes one parameter, the
conditions that mongoose passed to updateOne()
when trying to update
the document.
Error.MissingSchemaError
Type:
- «property»
Thrown when you try to access a model that has not been registered yet
Error.MongooseServerSelectionError
Type:
- «property»
Thrown when the MongoDB Node driver can’t connect to a valid server
to send an operation to.
Error.OverwriteModelError
Type:
- «property»
Error.ParallelSaveError
Type:
- «property»
An instance of this error class will be returned when you call save()
multiple
times on the same document in parallel. See the FAQ for more
information.
Error.StrictModeError
Type:
- «property»
Thrown when your try to pass values to model constructor that
were not specified in schema or change immutable properties when
strict
mode is "throw"
Error.StrictPopulateError
Type:
- «property»
An instance of this error class will be returned when mongoose failed to
populate with a path that is not existing.
Error.ValidationError
Type:
- «property»
An instance of this error class will be returned when validation failed.
The errors
property contains an object whose keys are the paths that failed and whose values are
instances of CastError or ValidationError.
Error.ValidatorError
Type:
- «property»
A ValidationError
has a hash of errors
that contain individual
ValidatorError
instances.
Example:
const schema = Schema({ name: { type: String, required: true } });
const Model = mongoose.model('Test', schema);
const doc = new Model({});
// Top-level error is a ValidationError, **not** a ValidatorError
const err = doc.validateSync();
err instanceof mongoose.Error.ValidationError; // true
// A ValidationError `err` has 0 or more ValidatorErrors keyed by the
// path in the `err.errors` property.
err.errors['name'] instanceof mongoose.Error.ValidatorError;
err.errors['name'].kind; // 'required'
err.errors['name'].path; // 'name'
err.errors['name'].value; // undefined
Instances of ValidatorError
have the following properties:
kind
: The validator’stype
, like'required'
or'regexp'
path
: The path that failed validationvalue
: The value that failed validation
Error.VersionError
Type:
- «property»
An instance of this error class will be returned when you call save()
after
the document in the database was changed in a potentially unsafe way. See
the versionKey
option for more information.
Error.messages
Type:
- «property»
See:
- Error.messages
The default built-in validator error messages.
Error.prototype.name
Type:
- «String»
The name of the error. The name uniquely identifies this Mongoose error. The
possible values are:
MongooseError
: general Mongoose errorCastError
: Mongoose could not convert a value to the type defined in the schema path. May be in aValidationError
class’errors
property.DivergentArrayError
: You attempted tosave()
an array that was modified after you loaded it with a$elemMatch
or similar projectionMissingSchemaError
: You tried to access a model withmongoose.model()
that was not definedDocumentNotFoundError
: The document you tried tosave()
was not foundValidatorError
: error from an individual schema path’s validatorValidationError
: error returned fromvalidate()
orvalidateSync()
. Contains zero or moreValidatorError
instances in.errors
property.MissingSchemaError
: You calledmongoose.Document()
without a schemaObjectExpectedError
: Thrown when you set a nested path to a non-object value with strict mode set.ObjectParameterError
: Thrown when you pass a non-object value to a function which expects an object as a paramterOverwriteModelError
: Thrown when you callmongoose.model()
to re-define a model that was already defined.ParallelSaveError
: Thrown when you callsave()
on a document when the same document instance is already saving.StrictModeError
: Thrown when you set a path that isn’t the schema and strict mode is set tothrow
.VersionError
: Thrown when the document is out of sync
Наткнулся на такую проблему с работой nodejs и mongo.
Делаю такую crm систему, где можно редактировать и удалять записи.
С редактированием все отлчино, а вот с записями которые должны быть удалены — не работает.
Выдает ошибку типу: «CastError: Cast to ObjectId failed for value «5dd050dd54b4a11fe4e2724adelete» at path «_id» for model «Post»»
На разных ресурсах читал что желательно установить меньше версию mongo&&mongoose на 2.7.2 и на 4.7.2(не важно), пробовал но ничего не получалось, мне npm выдавал ошибку и подсказывал команду npm audit/+fix, которые обновляли mongodb || mongoose.
Даже если оставлять mongoose на версии 4 — терминал пишет что одна из функции то ли remove/delete застарелая, и надо использовать deleteOne || removeOne.
Код модели:
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const PostSchema = new Schema({
title: {
type: String,
required: true
},
status: {
type: String,
default: 'public'
},
allowComments: {
type: String,
required: true
},
body: {
type: String,
require: true
},
})
module.exports = mongoose.model('Post', PostSchema)
Код роута:
router.delete('/:id', (request, response) => {
Post.remove({ _id: request.params.id}).then(result => {
response.redirect('/admin/posts')
})
})
Надеюсь на Вашу подсказку)
Чтобы сделать приложение с помощью мангуста и ejs
Я попытался деградировать другую версию мангуста, чтобы уловить проблему. Тоже пытался утешить.регистрируйте проблемы, из которых я узнал, что коллекция списков собирает данные с помощью метода .save (), в то время как коллекция элементов не может быть сохранена. Это происходит после того, как найденный список приложения.post(‘/’ ) выдает значение null, что приводит к ошибке «невозможно нажать значение null». MongooseError [CastError]: Cast to ObjectId failed for value "{ name: 'C' }" at path "_id" for model "List"
Эта ошибка возникает после нажатия на флажок . Который должен был удалить элементы внутри коллекции элементов пользовательского URL-адреса. Во время кодирования он работал некоторое время, затем перестал работать из-за некоторых перерывов в коде.
Файл Package.json:
{
"name": "todolist-v1",
"version": "1.0.0",
"description": "To do list app by EJS, backend API, MongoDB database",
"main": "app.js",
"scripts": {
"test": "echo "Error: no test specified" amp;amp; exit 1",
"start": "node app.js"
},
"author": "Clinto Abraham Ayamkudiyil",
"license": "ISC",
"dependencies": {
"body-parser": "^1.18.3",
"ejs": "^2.6.1",
"express": "^4.17.1",
"lodash": "^4.17.21",
"mongoose": "^5.12.1"
}
}
Обновлена версия npm для мангуста, ошибки в hyper :
CastError: Cast to ObjectId failed for value "{ name: 'Delete' }" at path "_id" for model "List"
at model.Query.exec (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:4361:21)
at model.Query.Query.findOneAndRemove (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:3108:8)
at Function.Model.findOneAndRemove (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibmodel.js:2909:13)
at Function.Model.findByIdAndRemove (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibmodel.js:2961:15)
at E:Full-Stack-DeveloperEJSputting all togethertoDoListapp.js:132:10
at Layer.handle [as handle_request] (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterlayer.js:95:5)
at next (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterroute.js:137:13)
at Route.dispatch (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterroute.js:112:3)
at Layer.handle [as handle_request] (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterlayer.js:95:5)
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterindex.js:281:22
at Function.process_params (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterindex.js:335:12)
at next (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterindex.js:275:10)
at serveStatic (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesserve-staticindex.js:75:16)
at Layer.handle [as handle_request] (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterlayer.js:95:5)
at trim_prefix (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterindex.js:317:13)
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesexpresslibrouterindex.js:284:7 {
messageFormat: undefined,
stringValue: `"{ name: 'Delete' }"`,
kind: 'ObjectId',
value: { name: 'Delete' },
path: '_id',
reason: Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
at new ObjectID (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesbsonlibbsonobjectid.js:59:11)
at castObjectId (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibcastobjectid.js:25:12)
at ObjectId.cast (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibschemaobjectid.js:279:12)
at ObjectId.SchemaType.applySetters (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibschematype.js:1104:12)
at ObjectId.SchemaType._castForQuery (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibschematype.js:1539:15)
at ObjectId.SchemaType.castForQuery (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibschematype.js:1529:15)
at ObjectId.SchemaType.castForQueryWrapper (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibschematype.js:1506:20)
at cast (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibcast.js:274:34)
at model.Query.Query.cast (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:4801:12)
at castQuery (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:4601:18)
at model.Query.Query._findAndModify (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:3461:23)
at model.Query.<anonymous> (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:3424:8)
at model.Query._wrappedThunk [as _findOneAndRemove] (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibhelpersquerywrapThunk.js:16:8)
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_moduleskareemindex.js:370:33
at processTicksAndRejections (internal/process/task_queues.js:75:11)
}
{ _id: 6058941ad1f874331c5bd61b, name: '' } Delete null
events.js:292
throw er; // Unhandled 'error' event
^
TypeError: Cannot read property 'push' of null
at E:Full-Stack-DeveloperEJSputting all togethertoDoListapp.js:99:19
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibmodel.js:4870:16
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibmodel.js:4870:16
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibhelperspromiseOrCallback.js:24:16
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibmodel.js:4893:21
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:4400:11
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_moduleskareemindex.js:136:16
at processTicksAndRejections (internal/process/task_queues.js:75:11)
Emitted 'error' event on Function instance at:
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibmodel.js:4872:13
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibhelperspromiseOrCallback.js:24:16
[... lines matching original stack trace ...]
at processTicksAndRejections (internal/process/task_queues.js:75:11)
EJS FILE
<%- include("header") -%>
<div class="box" id="heading">
<h1> <%= listTitle %> </h1>
</div>
<div class="box">
<% newListItems.forEach(function(item){ %>
<form action="/delete" method="post">
<div class="item">
<input
type="checkbox"
onchange="this.form.submit()"
value="<%= item._id %>"
name="checkbox"
>
<p><%= item.name %></p>
</div>
<input
type='hidden'
name="listName"
value="<%= listTitle %>"
>
</form>
<% }); %>
<form
class="item"
action="/"
method="post"
>
<input
type="text"
name="newItem"
placeholder="New Item"
autocomplete="off"
>
<button
type="submit"
name="list"
value=" <%= listTitle %> "
> </button>
</form>
</div>
<%- include("footer") -%>
app.js with app.post(‘delete’) has errors initiated
c//jshint esversion:6
const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const _ = require('lodash');
const { Schema } = mongoose;
const date = require(__dirname "/date.js");
var today = date.getDate();
const app = express();
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));
mongoose.connect("mongodb://localhost:27017/todolistDB", {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: true,
useCreateIndex : true
}); //useNewUrlParser: true is used for avoiding the deprecation warning
const itemsSchema = new Schema({
name: String
});
const Item = mongoose.model("Item", itemsSchema); // Collections name is Items, so we use singular form in model as 'Item'
const item1 = new Item({ name: "Hey, today's do list."});
const item2 = new Item({ name: "Hit the button to add a new item"});
const item3 = new Item({ name: "<= Hit this checkbox to delete an item."});
const defaultItems = [item1, item2, item3];
// const items = ["Buy Food", "Cook Food", "Eat Food"];
// const workItems = [];
const listSchema = new Schema({
name: String,
items: [itemsSchema]
});
const List = mongoose.model('List', listSchema);
app.get("/", function(req, res) {
Item.find({}, function(err, foundItems){
console.log(foundItems);
if (foundItems.length === 0){
Item.insertMany(defaultItems, function(err){
if (err){
console.log(err);
} else {
console.log("Successfully saved the default items to DB.");
}
res.redirect("/");
});
} else{
console.log(today);
res.render("list",
{
listTitle: today,
newListItems: foundItems
}
);
}
});
});
app.post("/", function(req, res){
const itemName = req.body.newItem;
const item = new Item( { name: itemName } );
const listName = req.body.list;
// console.log(itemName, item, listName);
if (listName === today){
item.save(function (err) {
if (err) {
console.log(err);
return handleError(err);
} else {
console.log('successfully saved inside "/" route content under todays date');
}
});
res.redirect("/");
console.log( itemName, item, listName);
//test add { _id: 6058562ddb96b030fcddc85e, name: 'test add' } Clintoayamkudi
} else {
List.findOne({name : listName }, function(err, foundList){
if (err){
console.log(err, itemName, item, listName);
} else {
console.log( itemName, item, listName, foundList);
//test add { _id: 6058562ddb96b030fcddc85e, name: 'test add' } Clintoayamkudi null
foundList.push(item);
// foundList.markModified('items'); // basically it helps in saving the modified files , since items is not readable -not helpful.
foundList.save();
res.redirect('/' listName);
}
});
}
// if (req.body.list === "Work") {
// workItems.push(item);
// res.redirect("/work");
// } else {
// items.push(item);
// res.redirect("/");
// }
});
app.post("/delete", function(req, res){
const checkedItemId = req.body.checkbox;
const listName = req.body.listName;
console.log(checkedItemId, req.body, listName);
//605315035dbba527c004e58e { checkbox: '605315035dbba527c004e58e', listName: 'Monday, March 22' } Monday, March 22
if(listName === today){
Item.findByIdAndRemove(checkedItemId, function(err){
if(!err){
console.log("successfully removed the checked item from the item list!!!");
res.redirect("/");
}
});
} else {
console.log(checkedItemId, listName);
//605878c7707cee19145c7779 Clinto92
List.findByIdAndRemove(
{
name: listName
},
{
$pull : {
_id : checkedItemId
}
},
function(err){
if(!err){
res.redirect('/' listName);
} else {
console.log(err);
}
});
}
});
app.get("/:customListName", function(req,res){
const customListName = _.capitalize(req.params.customListName);
List.findOne({name : customListName}, function(err, foundList){
if(!err){
if (!foundList){
console.log("data doesn't exist");
// create new list
const list = new List({
name: customListName,
items: defaultItems
});
list.save();
res.redirect('/' customListName);
} else {
console.log('the searched data exist in the mongoDB');
// show the existing list
res.render('list', {
listTitle: foundList.name,
newListItems: foundList.items
});
}
} else {
console.log(err);
}
});
});
app.get("/:customListName/about", function(req, res){
res.render("about");
});
app.listen(3000, function() {
console.log("Server started on port 3000");
});
Ошибки в гипертерминале
Я ухудшил версию мангуста, чтобы npm install mongoose@4.7.2
лучше понять, со всеми параметрами, показанными в журнале ниже:
MongooseError [CastError]: Cast to ObjectId failed for value "{ name: 'C' }" at path "_id" for model "List"
at new CastError (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooseliberrorcast.js:26:11)
at ObjectId.cast (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibschemaobjectid.js:147:13)
at ObjectId.castForQuery (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibschemaobjectid.js:187:15)
at cast (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibcast.js:192:34)
at model.Query.Query.cast (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:2742:12)
at castQuery (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:2648:18)
at model.Query.Query._findAndModify (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:1857:17)
at model.Query.Query.findOneAndRemove (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmquerylibmquery.js:2272:15)
at model.Query.Query._findOneAndRemove (E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_modulesmongooselibquery.js:1832:31)
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_moduleskareemindex.js:239:8
at E:Full-Stack-DeveloperEJSputting all togethertoDoListnode_moduleskareemindex.js:18:7
at processTicksAndRejections (internal/process/task_queues.js:75:11) {
stringValue: `"{ name: 'C' }"`,
kind: 'ObjectId',
value: { name: 'C' },
path: '_id',
reason: undefined,
model: [Function: model] {
hooks: Kareem { _pres: {}, _posts: {} },
base: Mongoose {
connections: [Array],
plugins: [],
models: [Object],
modelSchemas: [Object],
options: [Object]
},
modelName: 'List',
model: [Function: model],
db: NativeConnection {
base: [Mongoose],
collections: [Object],
models: [Object],
config: [Object],
replica: false,
hosts: null,
host: 'localhost',
port: 27017,
user: undefined,
pass: undefined,
name: 'todolistDB',
options: [Object],
otherDbs: [],
_readyState: 1,
_closeCalled: false,
_hasOpened: true,
_listening: false,
db: [Db]
},
discriminators: undefined,
schema: Schema {
obj: [Object],
paths: [Object],
subpaths: {},
virtuals: [Object],
singleNestedPaths: {},
nested: {},
inherits: {},
callQueue: [Array],
_indexes: [],
methods: {},
statics: {},
tree: [Object],
_requiredpaths: [],
discriminatorMapping: undefined,
_indexedpaths: undefined,
query: {},
childSchemas: [Array],
s: [Object],
options: [Object],
'$globalPluginsApplied': true
},
collection: NativeCollection {
collection: [Collection],
opts: [Object],
name: 'lists',
collectionName: 'lists',
conn: [NativeConnection],
queue: [],
buffer: false,
emitter: [EventEmitter]
},
Query: [Function (anonymous)] { base: [Object] },
'$__insertMany': [Function (anonymous)],
insertMany: [Function (anonymous)]
}
Заранее благодарю вас!
Я новичок в node.js, поэтому у меня есть ощущение, что это будет что-то глупое, что я упустил из виду, но я не смог найти ответ, который решает мою проблему. Я пытаюсь создать путь, который создаст новый дочерний объект, добавит его в родительский массив дочерних элементов, а затем вернет дочерний объект запрашивающей стороне. Проблема, с которой я столкнулся, заключается в том, что если я передаю идентификатор строки в findById, узел выйдет из строя с
TypeError: объект {} не имеет метода cast
Если вместо этого я попытаюсь передать ObjectId, я получу
CastError: сбой при преобразовании в ObjectId для значения «[object Object]» по пути «_id»
Вот приблизительный набросок моего кода:
Если я выполню этот код с путем «/ myClass / 51c35e5ced18cb901d000001 / childClass / create», это будет вывод кода:
ошибка: CastError: сбой преобразования в ObjectId для значения «[object Object]» по пути «_id» {«path»: «51c35e5ced18cb901d000001», «instance»: «ObjectID», «validators»: [], «setters»: [ ], «геттеры»: [], «_ index»: null}
Я пробовал использовать findOne и вместо этого передавал {_id: id}, но похоже, что это именно то, что делает findById. Я пробовал разные классы для ObjectId, которые я видел на других сайтах. Я пробовал вызывать ObjectId () как функцию вместо конструктора, и она возвращает undefined. На данный момент у меня заканчиваются идеи, и поиск ответа в Google не помогает. Есть идеи о том, что я делаю неправильно?
Кроме того, как я уже сказал, я новичок в node / Mongo / Mongoose / Express, поэтому, если есть лучший способ достичь моей цели, сообщите мне. Я ценю все отзывы.
РЕДАКТИРОВАТЬ:
После обходного пути от Питера Лайонса я погуглил еще одну ошибку, с которой я столкнулся, и нашел findByIdAndUpdate, который работает, как ожидалось, и делает именно то, что я надеялся сделать. Я до сих пор не уверен, почему findById и findOne вызывали у меня такие проблемы, и мне любопытно узнать (возможно, нужно отправить отчет об ошибке), поэтому я оставлю это открытым на случай, если у кого-то еще есть ответ.
- Я предполагаю, что вы звонили с одним , но ожидает обычный объект JS с условиями ключа / значения.
- Я ответил на этот вопрос здесь.
- 1 Проверьте свои маршруты. Может случиться так, что два маршрута имеют один и тот же пример начальной точки «#GET / user /: userID и #GET / user / list». Маршрут будет использовать «список» в качестве входных данных в базу данных и выдаст некоторую ошибку.
Краткий ответ: используйте mongoose.Types.ObjectId.
Mongoose (но не mongo) может принимать идентификаторы объектов в виде строк и правильно «преобразовывать» их для вас, поэтому просто используйте:
Однако предостережение заключается в том, что если не является допустимым форматом для строки идентификатора mongo, это вызовет исключение, которое вы должны перехватить.
Итак, основная непонятная вещь, которую нужно понять, это то, что имеет материал, который вы используете только при определении схем мангуста, а имеет материал, который вы используете при создании объектов данных, которые вы хотите сохранить в базе данных или объектах запроса. Итак, работает, предоставит вам объект, который вы можете сохранить в базе данных или использовать в запросах, и выдаст исключение, если задана недопустимая строка идентификатора.
принимает объект запроса и передает один экземпляр модели в функцию обратного вызова. А — это буквально оболочка (см. Исходный код здесь). Просто принимает объект запроса и передает массив соответствующих экземпляров модели в функцию обратного вызова.
Просто не торопись. Это сбивает с толку, но я могу гарантировать, что вы запутались и не столкнетесь с ошибками в мангусте. Это довольно зрелая библиотека, но нужно время, чтобы освоиться с ней.
Другая подозрительная вещь, которую я вижу в вашем фрагменте, заключается в том, что не используется при создании экземпляра . Кроме того, вам необходимо опубликовать код схемы, чтобы мы помогли вам отследить любые оставшиеся CastErrors.
- Если я попытаюсь использовать «mongoose.Types.ObjectId (» 51c35e5ced18cb901d000001 «);» (помещая его непосредственно в код), я все равно получаю сообщение об ошибке «TypeError: Object {} не имеет метода cast». Я также попытался создать его как объект и получил ту же ошибку.
- Обновиться до последней версии мангуста? Я на 3.6.11.
- Вызов MyClass.find (req.params.id) работает. Разве findOne и findById не должны работать одинаково? Просто кажется немного нелогичным, чтобы find была функцией, которая возвращает один документ, когда существуют два других. Я изменил код, чтобы получить первый элемент массива, но теперь он не работает в addToSet () с «TypeError: Object {} не имеет метода cast».
- Я тоже на 3.6.11. Я только что настроил все это накануне вечером, так что я ожидаю, что все уже обновлено.
- 1 Вы используете неправильную функцию-конструктор. Используйте . предназначен только для определения схем.
Я столкнулся с этой ошибкой, потому что значение, которое вы хотите отфильтровать в поле _id, не в формате идентификатора, одно «если» должно решить вашу ошибку.
Чтобы решить эту проблему, всегда проверяйте, является ли значение критерия для поиска допустимым ObjectId.
- 2 Правильно. Я тестировал конечную точку для пользователя с , оказалось, что параметр id должен быть 12 бит, иначе mongoose не сможет выполнить приведение. Я использовал случайные короткие числа.
Для всех тех, кто застрял с этой проблемой, но все еще не мог ее решить: я наткнулся на ту же ошибку и обнаружил, что поле пустое.
Я описал это здесь более подробно. До сих пор не нашел решения, кроме изменения полей в на поля без идентификатора, что для меня является грязным взломом. Я, наверное, собираюсь отправить отчет об ошибке для мангуста. Любая помощь будет оценена по достоинству!
Изменить: я обновил свою ветку. Я подал заявку, и они подтвердили отсутствие проблемы с номером . Это будет исправлено в версии 4.x.x, релиз-кандидат которой доступен прямо сейчас. ПДУ не рекомендуется для продуктивного использования!
- интересно, я думаю, у меня такая же проблема, мой _id был undefined и поэтому не мог быть приведен к ObjectId
Если у вас возникла эта проблема и вы выполняете заполнение где-то по строкам, см. Эту проблему с Mongoose.
Обновите Mongoose 4.0, и проблема исправлена.
Была та же проблема, я просто привел идентификатор в строку.
Моя схема:
А потом при вставке:
Я получал эту ошибку CastError: CastError: Cast to ObjectId failed for value «[object Object]» в пути «_id» после создания схемы, а затем ее изменения и не удалось отследить. Я удалил все документы в коллекции и смог добавить 1 объект, но не второй. В итоге я удалил коллекцию в Mongo, и это сработало, поскольку Mongoose воссоздал коллекцию.
Для справки: у меня возникла эта ошибка при попытке неправильно заполнить вложенный документ:
look ^ value — это массив, содержащий объект: неправильно!
Объяснение: я отправлял данные с php на API node.js таким образом:
Как видите, $ history — это массив, содержащий массив. Вот почему мангуст пытается заполнить _id (или любое другое поле) массивом, а не Scheme.ObjectId (или любым другим типом данных). Следующие работы:
Я также столкнулся с этой ошибкой мангуста CastError: Cast to ObjectId не удалось для значения «583fe2c488cf652d4c6b45d1 » в пути «_ id » для модели User
Поэтому я запускаю команду npm list, чтобы проверить версию mongodb и mongoose в моем локальном файле. Вот отчет: ……
……
├── [email protected]
├── [email protected]
…..
Кажется, в этой версии mongodb есть проблема, поэтому я удалил ее и попытался использовать другую версию, такую как 2.2.16
, он удалит mongodb из вашего каталога node_modules. После этого установите нижнюю версию mongodb.
Наконец, я перезапускаю приложение, и ошибка CastError исчезла !!
У меня была та же проблема. Оказывается, мой Node.js устарел. После обновления все заработало.
просто измените путь, он будет работать например
изменить на
Я просто добавил —es— к пути (myClass), чтобы стать (myClasses)
теперь должно работать и не увидит эту ошибку
Мое решение состоит в том, что мне нужны данные из всех документов, и мне не нужен _id, поэтому
У меня была та же проблема, которая возникла после того, как я обновил свою схему, я забыл, что вызывал модель, используя старый идентификатор, который был создан мной; Я обновил свою схему примерно так:
к
Оказалось, что, поскольку мой код большой, я звонил на со старым идентификатором, поэтому проблема.
Я пишу здесь, чтобы помочь кому-то еще: пожалуйста, проверьте свой код на неизвестные неправильные вызовы! это может быть проблемой, и это может спасти ваши огромные головные боли!
I am new to node.js, so I have a feeling that this will be something silly that I have overlooked, but I haven’t been able to find an answer that fixes my problem. What I’m trying to do is create a path that will create a new child object, add it to the parent’s array of children, then return the child object to the requester. The problem that I am running into is that if I pass the string id into findById, node crashes with
TypeError: Object {} has no method ‘cast’
If I try to pass in an ObjectId instead, I get
CastError: Cast to ObjectId failed for value «[object Object]» at path «_id»
Here is a rough outline of my code:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId
mongoose.connect('mongodb://user:password@server:port/database');
app.get('/myClass/:Id/childClass/create', function(request, result) {
var id = new ObjectId(request.params.Id);
MyClass.findById(id).exec( function(err, myClass) {
if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
var child = ChildClass();
myClass.Children.addToSet(child);
myClass.save();
result.send(child);
});
});
If I execute this code with the path «/myClass/51c35e5ced18cb901d000001/childClass/create», this is the output of the code:
error: CastError: Cast to ObjectId failed for value «[object Object]» at path «_id»
{«path»:»51c35e5ced18cb901d000001″,»instance»:»ObjectID»,»validators»:[],»setters»:[],»getters»:[],»_index»:null}
I’ve tried using findOne and passing in {_id:id} instead, but this appears to be exactly what findById does. I’ve tried the different classes for ObjectId that I’ve seen listed on other sites. I’ve tried calling ObjectId() like a function instead of a constructor and that returns undefined. At this point, I’m running out of ideas and it doesn’t seem that googling for an answer is helping. Any ideas on what I’m doing wrong?
Also, like I said, I’m new to node/Mongo/Mongoose/Express, so if there is a better way to accomplish my goal, please let me know. I appreciate all feedback.
EDIT:
After the workaround from Peter Lyons, I googled another error that I was running into and found findByIdAndUpdate, which works as expected and does exactly what I was hoping to do. I’m still not sure why findById and findOne were giving me such issues and I’m curious to know (maybe a bug report needs to be filed), so I’ll leave this open in case someone else has an answer.