Tengo un Node.js app. Esta es la primera vez que estoy tring para usar MongoDB.

Puedo obtener esta excepción al intentar insertar un documento:

Puede asignar a la propiedad de sólo lectura ‘_id’ de {«title»:»algún título»,»content»:»algunos de los contenidos»,»tags»:»#algunos #tags»}

Esta es la línea de código donde se produce:

db.collection(collectionName).insertOne(json, callback);

He oído que _id es un valor que Mongo supone que se debe crear por sí mismo. He encontrado muchas preguntas con la misma excepción, pero ya no con el campo _id o con el campo _id pero en el lado del cliente y no me ayuda en absoluto.

Cualquier ayuda será profundamente apreciado!

El código completo:

mongo-manager.js:

var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/blog';

function performOperation (func){
    MongoClient.connect(url, function(err, db) {

        func(db, function(err, result) {
            db.close();
        });
    });
}

function insertOne(db, collectionName, json, callback){
    db.collection(collectionName).insertOne(json, callback);
}

exports.addPost = function(json) {
    performOperation(func);

    function func (db, callback) {
        insertOne(db, "posts", json, callback)
    }
};

index.js:

var express = require('express');
var router = express.Router();

router.post('/posts', function(req, res, next){
  var mongoManager = require('../dal/mongo-manager.js');
  mongoManager.addPost(JSON.stringify(req.body));
});

module.exports = router;
  • Se puede ver cómo se está creando json? insertOne agregará un único _id de la propiedad, si no existe ya, pero su json objeto que parece ser una de sólo-lectura del objeto.
  • I anexa el código necesario a mi pregunta.
  • Omitir la JSON.stringify llamar y pasar req.body a addPost. insertOne necesidades de un objeto, no una cadena.
  • Oh, yo soy estúpido! Quería convertirlo en objeto de JavaScript para JSON para omitir el prototipo, pero en vez de eso me convierte a string. @JohnnyHK bien hecho. Por favor, escribir como una respuesta.
InformationsquelleAutor Alon | 2016-02-07

2 Comentarios

  1. 8

    Omitir la JSON.stringify llamar y pasar req.body a addPost. insertOne necesidades de un objeto, no una cadena.

    De por qué esto está causando que el mensaje de error específico: insertOne agregará un único _id propiedad al valor pasado como el doc parámetro si no existe ya, pero una cadena es de sólo-lectura (inmutable) objeto de modo que no se puede agregar _id a ella.

  2. 0

    He tenido un problema similar y era porque de la obj que se dio fue un string

    y que no se puede establecer propiedades de strings

    esta solucionado mi problema:

    if(window.Prototype) {
           delete Object.prototype.toJSON;
           delete Array.prototype.toJSON;
           delete Hash.prototype.toJSON;
           delete String.prototype.toJSON;
    }

    El código JS eran esto ocurre se ejecutan en el navegador.

Dejar respuesta

Please enter your comment!
Please enter your name here