2017-07-12 2 views
1

Je suis nouveau à la pile MEAN alors s'il vous plaît pardonnez ma question naïve, mais je n'ai pas réussi à comprendre comment passer un message d'erreur personnalisé de mon Mongoose Pré-enregistrer crochet middleware à mon contrôleur Angularjs.

J'utilise un crochet de pré-enregistrement pour vérifier si un document a déjà été sauvegardé. Si c'est le cas, je veux annuler la tentative d'enregistrement et plutôt mettre à jour le document. J'ai utilisé la méthode next(new Error('Error message')) pour empêcher l'action save. Ci-dessous mon code:

A mon arrière-plan:Obtenir le message d'erreur transmis à mongoose middleware next() méthode au contrôleur client

VoteSchema.pre('save',function(next){ 
    var self = this; 
    self.constructor.findOneAndUpdate(
    {'choice._id':self.choice._id}, 
    {$inc:{'choice.count':1}}, 
    {new:true}, 
    function(err,doc){ 
     if(err) return next(err); 
     if(doc!==null){ 

     //I want to be able to pass a type like this {x:1, y:2} 
     //to my angular controller from here. How do I do this? 

     return next(new Error("Canceled save attempt!")); //this cancels the save 
     } 
     return next(); 
    }); 
}); 

A mon contrôleur client:

vote.$save(function (response) { 
     console.log(response); 
    }, 
    function (errorResponse) { 

     //I want to get my custom type from the pre-save 
     //middleware hook here which was equals to {x:1, y:2} 
     //or at least the message "Canceled save attempt!" 
     //Note that I checked the 'errorResponse' object but 
     //it isn't anywhere there 

     console.log(errorResponse); 
    } 
); 

En d'autres termes, comment puis-je passer un objet personnalisé de middleware mangouste (pré-enregistrer crochet) à un contrôleur angulaire?

Répondre

0

Ce que je fais dans mon projet, je l'ai créé un fichier error.js et a également créé de nombreuses erreurs possibles, et quand il est nécessaire d'envoyer je requiers simplement mes error.js et envoie erreur comme ci-dessous le code:

error.js:

var errors = {}; 
var util = require('util'); 

/** 
* Used to create errors 
* @Param {Number} httpCode - http response code 
* @Param {String} message - Error message 
*/ 
function ApiError(httpCode, httpMessage, description) { 
    this.httpCode = httpCode; 
    this.httpMessage = httpMessage; 
    this.description = description; 
    this.details = null; 
} 

// inherit the Error class 
util.inherits(ApiError, Error); 

// exporting error Object 
module.exports = errors; 

errors.ApiError = ApiError; 

/** 
* Sends httpCode and message to user 
* @Param {Response} res - http response 
*/ 
ApiError.prototype.send = function (res) { 
    res.status(this.httpCode); 
    res.json({ httpCode: this.httpCode, httpMessage: this.httpMessage, description: this.description, details: this.details }) 
} 

ApiError.prototype.withDetails = function (details) { 
    this.details = details; 
    return this; 
}; 

errors.not_registeration = new ApiError(404, 'NOT_REGISTERATION', 
    'User not registered with this email/mobile.'); 


errors.invalid_login = new ApiError(400, 'INVALID_LOGIN', 
    'Login credentials do not match any registered user.'); 

Vous pouvez créer vos propres erreurs avec les codes ici comme je l'ai déjà créé.

Comment utiliser les erreurs dans mon dossier:

var errors = require('../../library/errors'); 
..... 
..... 
..... 
VoteSchema.pre('save',function(next){ 
    var self = this; 
    self.constructor.findOneAndUpdate(
    {'choice._id':self.choice._id}, 
    {$inc:{'choice.count':1}}, 
    {new:true}, 
    function(err,doc){ 
     if(err) return next(err); 
     if(doc!==null){ 

     return next(errors.not_registeration) // Here i am sending errors. 
     or 
     return next(errors.invalid_input.withDetails("This is extra details")); 

     } 
     return next(); 
    }); 
}); 

Réponse serait à chaque fois:

Si le retour suivant (errors.not_registeration) -

{ 
     "httpCode": 404, 
     "httpMessage": "NOT_REGISTERATION", 
     "description": "User not registered with this email/mobile.", 
     "details": null 
    } 

Si ret urne suivante (errors.invalid_input.withDetails ("Ceci est des détails supplémentaires")) -

{ 
    "httpCode": 400, 
    "httpMessage": "INVALID_INPUT", 
    "description": "The request input is not as expected by API. Please provide valid input.", 
    "details": "This is extra details" 
} 

** Comme je comprends que vous voulez transmettre des données à middleware suivant. Ensuite, vous pouvez le faire dans le middleware actuel:

res.locals.result={ X:1,Y:1}; 

Dans le middleware suivant, vous seriez en mesure d'obtenir X, Y comme ça: console.log(res.locals.result); Vous pouvez passer quoi que ce soit dans le middleware suivant à l'aide res.locals.

+0

Je ne reçois aucun des messages d'erreur transmis à la fonction 'next()' dans mon contrôleur client –

+0

pour faire ce que vous voulez, vous devriez utiliser res.locals.result = {X: 1, Y: 1 }, Dans le middleware suivant, vous seriez en mesure d'obtenir X, Y. dans le prochain middleware console.log (res.locals.result); –

+0

J'ai également mis à jour ma réponse. S'il vous plaît jeter un coup d'oeil et laissez-moi savoir si c'est utile ou non. –