2017-01-23 10 views
0

Scheint, wie ich nicht eine Eigenschaft von einem Objekt param aus einem anderen Versprechen in NodeJSLöschen Eigenschaft eines Argument Objekt in NodeJS

ich

schreiben Say löschen
Person.save().exec().then(function(err, object){ 

    create(object) // Lets assume object looks like -> {person : "don"}; 
}) 

create: function(object){ 
    delete object.person; 
    console.log(object) // It still has this name property 

} 
However, If I do a deep copy inside of nodejs code's create call it deleted that property. 

Dann, im Gegenteil, wenn ich schreibe etwas wie

function a(){ let abc = { person: "don"}; xyz(abc)} 
function xyz(param){ 
delete param.person; 
console.log(param); ... It logs an empty object. 
} 
a() 

Es macht den Trick, ohne eine tiefe Kopie durchzuführen. Was ist der Grund dafür?

+0

Es gibt zu wenig Code hier für uns zu sehen, was genau vor sich geht. Das Hinzufügen von benutzerdefinierten Eigenschaften zu Versprechungen ist im Allgemeinen eine schlechte Sache, weil Versprechungen oft angekettet sind (neue Versprechungen, die ständig von alten erstellt werden, so dass es schwierig ist, das gleiche Objekt zu behalten). Außerdem wird 'create (object)' keine Methode wie Ihre Show für die 'create: function()' Definition aufrufen. Und '' save.then (function (err, object) {'ist nicht die Signatur eines' .then() 'Handlers auf einem echten Versprechen.' .then() 'Handler werden nur ein einziges Argument übergeben. – jfriend00

+0

Ja Ich schreibe den exakten Code – kushalvm

+0

Beachten Sie, dass '.name' ein reservierter Eigenschaftenname für einige Arten von Objekten (wie Funktionsobjekte) ist und eine Standardkonfiguration hat, die es nicht erlaubt, sie zu ändern. – jfriend00

Antwort

0

Ich würde sagen, das ist aufgrund der Art und Weise, wie MongoDB/Mongoose (die aussieht, als ob Sie verwenden) Objekte funktionieren.

Sie können ein Mongoose-Objekt in ein reguläres JS-Objekt konvertieren, indem Sie .toObject() aufrufen. So zum Beispiel:

Person.save().exec().then(function(err, person){ 

    delete person.name; // won't work 

    var newPerson = person.toObject(); // newPerson is now a regular JS object 
    delete newPerson.name; // should work 
    console.log(newPerson.name); // should return undefined 
}); 
+0

Ich fühle, dass Sie Recht haben, da ich dies gelöst hatte, indem Sie dies tun 'var newObj = JSON.parse (JSON.stringify (myObj))' – kushalvm

+0

Das funktioniert auch, ist aber eine weniger effiziente Version der '.toObject()' -Funktion , die dir genau das gibt, was du brauchst. – Aron

Verwandte Themen