Mangouste Schéma d'Erreur: “Jette à la chaîne a échoué pour valeur” lors de la poussée de l'objet de tableau vide
J'ai un problème étrange et ne peut pas comprendre ce qu'est le problème. Le message d'Erreur n'aide pas.
Je suis l'envoi d'une "alarme" sur le serveur et que vous voulez enregistrer cette alarme à mon "appareil" qui existent déjà dans la base de données.
L'objet d'alarme-je l'envoyer au serveur ressemble à ceci:
{actionTaken: "none",
dateTime: "20152111191512",
difference: 4.88,
timestamp: 1448128894781}
Le Schéma de l'appareil comme suit:
var deviceSchema = new Schema({
deviceId: {
type : String,
index : {
unique : true,
dropDups : true
}
},
alarms : [ {
timestamp : Number,
dateTime : String, //yyyymmddhhss
difference : Number,
actionTaken : String, //"send sms"
} ]
});
Je charge l'appareil à partir de la base de données (id est):
Thermometer.findOne({
deviceId : deviceId
}, function(error, device){
//error handling
var now = (new Date().getTime());
var nowDateTime = (new Date()).toISOString().slice(0, 19).replace(/[-T\s:]/g, "");
var newAlarm = {
timestamp : now,
dateTime : nowDateTime, //yyyymmddhhmmss
difference : diff,
actionTaken : "none"
};
device.alarms.push(newAlarm); //EXCEPTION !
// device.save //doesn't get called
});
Comme vous pouvez le voir dans les commentaires, j'obtiens une Exception ou d'Erreur quand je veux pousser le "newAlarm"objet pour les alarmes-tableau de mon appareil.
Le message d'Erreur indique: Fonte de la chaîne a échoué pour valeur "[object object]" dans le chemin "alarmes"
Erreur-Objet:
kind: "string",
message: "Cast to string failed for value "[object Object]" at path "alarms"",
name: "CaseError",
path: "alarms",
stack: undefined,
value: {actionTaken: "none", dateTime: "20152111191512", difference: 4.88, timestamp: 1448128894781}
Avez-vous une idée?
Pour moi, il ne fait aucun sens. Le tableau et son contenu (l'objet) est spécifié dans le Schéma. Pourquoi est-il une chaîne de fonte d'erreur avec l'ensemble de l'objet comme valeur?
Ce que j'utilise:
"express": "3.2.6",
"express-session":"1.7.6",
"hjs": "*",
"mongoose": "4.0.5",
"nodemailer": "1.4.0"
EDIT: je ne veux pas utiliser les Schémas imbriqués. Il est également possible de le faire avec des tableaux. - Je le faire avec des tableaux dans d'autres Schémas.
EDIT 2:
J'ai ajouté une propriété "lastAlarm" et ne
device.lastAlarm = alarm;
mais après que, d'un thermomètre.lastAlarm est toujours pas défini... mais l'alarme est un objet. Ainsi est-il possible que l'appareil de l'objet est verrouillé certains comment?
OriginalL'auteur Laokoon | 2015-11-21
Vous devez vous connecter pour publier un commentaire.
Je voudrais déclarer alarme comme son propre schéma et régler les alarmes de la propriété comme un tableau d'alarme aka les sous-documents. Cela vous permettra d'ajouter la validation de l'alarme schéma, etc. NOTE: les sous-documents ne sont pas sauvegardées jusqu'à ce que le parent est sauvegardé.
OriginalL'auteur mr.freeze
Mangouste interprète l'objet dans le Schéma avec la clé 'type' dans votre schéma de définition de type de cet objet.
Donc pour ce schéma mangouste interprète deviceId comme une Chaîne de caractères à la place de l'Objet et de ne pas se soucient de tous les autres clés à l'intérieur de deviceId.
SOLUTION:
Ajouter cette option objet de déclaration de schéma de
{ typeKey: '$type' }
En ajoutant ce que nous demandons mangouste à utiliser
$type
pour interpréter le type de clé à la place de mots clés par défauttype
Mangouste Docs de référence: https://mongoosejs.com/docs/guide.html#typeKey
OriginalL'auteur Krishna Pravin
Peut-être que c'est trop tard, mais ici, la mangouste est en supposant que deviceId n'est pas un objet et il est de type String
SOLUTION SIMPLE:
OriginalL'auteur AJoboori
Je vous recommande de faire un schéma pour les alarmes. Je pense que u ne peut pas définir un tableau dans un schéma comme vous le faites.
OriginalL'auteur Sprotte
Utilisation intérieure schéma pour résoudre ce problème,
OriginalL'auteur Vinoth Rajendran