Comment puis - je détecter si mon fichier Node.JS a été appelé en utilisant SH: node path-to-file
ou JS: require('path-to-file')
?
Ceci est l'équivalent Node.JS de ma question précédente en Perl: Comment puis-je exécuter mon script Perl uniquement s'il n'a pas été chargé avec require?
Réponses:
Voir la documentation à ce sujet ici: https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module
la source
require()
, mais vous pouvez peut-être le faire soit en important le fichier puis en l'exécutanteval
, soit en exécutantrequire('child_process').exec('node the_file.js')
es-main
package pour vérifier si un module a été exécuté directement.Il existe une autre méthode, légèrement plus courte (non décrite dans les documents mentionnés).
var runningAsScript = !module.parent;
J'ai décrit plus en détail comment tout cela fonctionne sous le capot dans cet article de blog .
la source
node script.js
mais pascat script.js | node
. Cette méthode fonctionne pour les deux.J'étais un peu confus par la terminologie utilisée dans les explications. J'ai donc dû faire quelques tests rapides.
J'ai trouvé que ceux-ci produisent les mêmes résultats:
Et pour les autres confus (et pour répondre directement à la question):
la source
Tout comme en Python, je me retrouve toujours à essayer de me rappeler comment écrire ce putain d'extrait de code. J'ai donc décidé de créer un module simple pour cela. Cela m'a pris un peu de temps à développer, car l'accès aux informations du module de l'appelant n'est pas simple, mais c'était amusant de voir comment cela pourrait être fait.
L'idée est donc d'appeler un module et de lui demander si le module appelant est le principal. Nous devons comprendre le module de la fonction appelant. Ma première approche a été une variation de la réponse acceptée:
Mais cela n'est pas garanti de fonctionner.
module.parent
pointe vers le module qui nous a chargés en mémoire, pas celui qui nous appelle. Si c'est le module appelant qui a chargé ce module d'assistance en mémoire, c'est bien. Mais si ce n'était pas le cas, nous sommes impuissants. Nous devons donc essayer autre chose. Ma solution était de générer une trace de pile et d'obtenir le nom du module de l'appelant à partir de là:Maintenant, nous pouvons faire:
Ou plus lisible:
Inoubliable :-)
la source
return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
Essayez ceci si vous utilisez des modules ES6:
la source
process.mainModule
estundefined