Casterror код ошибки

  • 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’s type, like 'required' or 'regexp'
  • path: The path that failed validation
  • value: 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 error
  • CastError: Mongoose could not convert a value to the type defined in the schema path. May be in a ValidationError class’ errors property.
  • DivergentArrayError: You attempted to save() an array that was modified after you loaded it with a $elemMatch or similar projection
  • MissingSchemaError: You tried to access a model with mongoose.model() that was not defined
  • DocumentNotFoundError: The document you tried to save() was not found
  • ValidatorError: error from an individual schema path’s validator
  • ValidationError: error returned from validate() or validateSync(). Contains zero or more ValidatorError instances in .errors property.
  • MissingSchemaError: You called mongoose.Document() without a schema
  • ObjectExpectedError: 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 paramter
  • OverwriteModelError: Thrown when you call mongoose.model() to re-define a model that was already defined.
  • ParallelSaveError: Thrown when you call save() 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 to throw.
  • 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.

Понравилась статья? Поделить с друзьями:
  • Cassida 6650 ошибка err
  • Cassida 6650 ошибка dbl
  • Cassida 6650 ошибка chn
  • Caso maitre 3500 ошибка е09
  • Cashcode ошибка транспортного мотора