11
votes

Comment puis-je enregistrer chaque méthode appeler Node.js sans ajouter de lignes de débogage partout?

Je voudrais enregistrer l'user_id de la personne faisant une demande et le nom de la méthode de chaque méthode appelée à une classe JavaScript. Par exemple:

35 - log_in
35 - list_of_other_users
78 - log_in
35 - send_message_to_user
35 - connect_to_redis
78 - list_of_other_users


1 commentaires

3 Réponses :


3
votes

Je suppose que ceci est une application Web, dans laquelle si vous utilisez Connect, vous pouvez utiliser un middleware Logger qui enregistre l'utilisateur et le chemin d'URL, qui est probablement suffisant. Sinon, vous allez devoir faire des métaprogramming le long des lignes d'enveloppement de chaque fonction dans une fonction d'emballage pour effectuer la journalisation.

function sendMessage() {
    //code to send message
    //can use `this` to access instance properties
}
function MyClass(userId) {
    this.userId = userId; //or whatever
    this.sendMessage = logCall(sendMessage, this);
    //repeat above line for each instance method you want instrumented for logging
}


0 commentaires

4
votes

Ceci est une alternative, pas tout à fait sûr à quel point il est fiable, il se sent un peu faux: xxx pré>

comme vous pouvez le constater, il écrase le appel code> Fonction - Cela crée un léger problème lorsque vous essayez d'appeler console.log () code> de sorte que vous devez échanger la fonction de retour. Mais il semble fonctionner! P>

EDIT STRT> P>

Etant donné que cela est étiqueté CoffeScript: P>

do ->
  oldCall = Function::call
  newCall = (self) ->
    Function::call = oldCall
    console.log "Function called: #{this.name}"
    args = Array.prototype.slice.call arguments, 1
    Function::call = newCall
    this.apply self, args
  Function::call = newCall


1 commentaires

Cela va dans une récursion infinie pour moi puisque la tranche est appelée en tant que fonction. Je devais déplacer l'appel de la tranche avant de définir NewCall et transmettre le résultat en tant que variable ci-dessous. Pas sûr si cela fonctionne maintenant



8
votes

La réponse est essentiellement correcte, mais voici comment éviter la récursivité infinie

JavaScript xxx

Coffeescript xxx


1 commentaires

C'est génial mais pourriez-vous éclairer comment cela fonctionne et peut-être proposer un exemple d'utilisation? C'est assez avancé et SE est également pour les utilisateurs débutants / intermédiaires. :RÉ