2017-03-21 1 views
0

Je joue autour avec feathers.js ces derniers temps, et je l'aime. J'ai le problème suivant mais ...Modification du code d'état de réponse dans les plumes Hook.Result

Dans un crochet avant placé pour la méthode de serveur update (http put) je décide si create ou update basé sur certaines conditions. Et si je choisis create je saute la méthode de service en utilisant Hook.Result

let createLocation = (hook) => { 
    return hook.app.service('locations').create({ 
    "user": hook.data.user, 
    "location": [{ 
     "latitude": hook.data.location[0].latitude, 
     "longitude": hook.data.location[0].longitude 
    }] 
    }).then(location => { 
    hook.result = location; 
    //************ change the response status code here?? **************\\ 
    }); 
}; 

Mais je ne suis pas en mesure de changer le code d'état de réponse à coller à 201 created. L'aide serait appréciée. (Veuillez également pointer sur le code source où cela est géré si possible, j'ai fait une recherche mais je n'ai pas réussi).

Répondre

1

Services et crochets sont le transport indépendant qui est la raison pour laquelle ils peuvent être utilisés par les deux, websockets et HTTP. Toute logique spécifique à HTTP devrait vivre dans son propre middleware. Il y a deux options. Pour définir le code d'état pour tous les services, vous pouvez implémenter a custom formatter, pour seulement un service spécifique, vous pouvez register service specific middleware.

S'il n'y a aucun moyen de déduire le code d'état à partir des données, vous pourriez define a hidden property (ce n'est pas inscriptible et ne sera pas affiché lors de la conversion à JSON) sur l'objet de données:

let createLocation = (hook) => { 
    return hook.app.service('locations').create({ 
    "user": hook.data.user, 
    "location": [{ 
     "latitude": hook.data.location[0].latitude, 
     "longitude": hook.data.location[0].longitude 
    }] 
    }).then(location => { 
    Object.defineProperty(location, '__status', { 
     value: 201 
    }); 
    hook.result = location; 
    }); 
}; 

et l'utiliser dans un formatter personnalisé:

const app = feathers(); 

function restFormatter(req, res) { 
    res.format({ 
    'application/json': function() { 
     const data = res.data; 

     res.status(data.__status || 200); 
     res.json(data); 
    } 
    }); 
} 

app.configure(rest(restFormatter)); 

il y a d'autres options comme passing the response to params ou au lieu de retourner un objet wrapper ({ status, data }) qui contient des informations méta supplémentaires.