कमांड लाइन (नोड जेएस) से स्क्रिप्ट में फ़ंक्शन चलाएँ


204

मैं नोड में एक वेब ऐप लिख रहा हूं। अगर मुझे db.jsइसमें फ़ंक्शन के साथ कुछ JS फाइल मिली है तो मैं initकमांड लाइन से उस फ़ंक्शन को कैसे कॉल कर सकता हूं?


NPM रन समारोह का उपयोग stackoverflow.com/a/43598047/696535
पावेल

3
@Pawel मैं स्वीकृत उत्तर को प्राथमिकता देता हूं क्योंकि इसमें तृतीय पक्ष निर्भरता स्थापित करने की आवश्यकता नहीं होती है जो या तो समर्थन खो सकता है या कमजोरियों को शामिल कर सकता है। यह एक जोखिम है जिसे आप किसी भी निर्भरता के साथ चलाते हैं, इसलिए निर्भरता को अच्छी तरह से सीमित और बनाए रखने के लिए हमेशा एक अच्छा विचार है।
winhowes

जवाबों:


329

कोई टिप्पणी नहीं कि आप ऐसा क्यों करना चाहते हैं, या एक अधिक मानक अभ्यास क्या हो सकता है: यहां आपके प्रश्न का समाधान है .... ध्यान रखें कि आपके कमांड लाइन द्वारा आवश्यक उद्धरणों के प्रकार भिन्न हो सकते हैं।

अपने में db.js, initफंक्शन को एक्सपोर्ट करें । कई तरीके हैं, लेकिन उदाहरण के लिए:

module.exports.init = function () {
  console.log('hi');
};

फिर इसे इस तरह से कॉल करें, मान लें कि आपकी db.jsनिर्देशिका उसी कमांड में है जो आपका कमांड प्रॉम्प्ट है:

node -e 'require("./db").init()'

अन्य पाठकों के लिए, ओपी के initकार्य को कुछ भी कहा जा सकता है, यह महत्वपूर्ण नहीं है, यह प्रश्न में प्रयुक्त विशिष्ट नाम है।


80
यह कुछ जावास्क्रिप्ट का परीक्षण करने के लिए एक उपयोगी टिप थी जो AWS लैम्ब्डा से चल रही थी - धन्यवाद
एलेक्स हिंटन

14
यदि फ़ंक्शन async है तो क्या होता है?
ऑगस्टिन रिडिंगर

24
मामले में किसी और को उनके पैकेज में ऐसा करने की कोशिश कर रहा है। एक npm स्क्रिप्ट के रूप में, मैंने इसे सिंगल कोट्स, और दोहरे उद्धरणों के साथ आज़माया, लेकिन यह तब तक काम नहीं किया जब तक कि मैंने उन्हें स्विच नहीं किया: "स्टार्ट": "नोड - e \ "आवश्यकता ('./ सर्वर') () \" ",
साको 73

2
आपके उत्तर के लिए धन्यवाद @winhowes, मैंने सिर्फ आपके उदाहरण का उपयोग किया module.exports.init = function () { console.log('hi'); };और node -e 'require("./db").init()'मेरे लिए किसी तरह काम नहीं किया। मुझे यकीन नहीं है कि मैंने क्या गलत किया, लेकिन आपके विचार का पालन करते हुए, मैंने उपयोग किया module.exports = myFunction, , और फिर node -e 'require("./myFunction")()'मेरे लिए काम किया।
C.Lee

3
@ एलेक्सहिंटन की टिप्पणी के लिए एक वृद्धि के रूप में, मैं अब एक घटना और कॉलबैक की नकल करने के लिए निम्नलिखित का उपयोग करता हूं node -e 'require("./index").handler(require("./fixtures/sample_event_01.json"), {}, console.log)':। बीच {}का संदर्भ होगा, बेझिझक समायोजित करें। साथ ही कंसोल .log थोड़ा आदिम है लेकिन एक अच्छी शुरुआत है। बेशक आप एक समर्पित CLI.js भी लिख सकते हैं, जो अन्य टिप्पणियों में बताए अनुसार index.js / हैंडलर की आवश्यकता होती है।
एड्रियन फोदर

50

अन्य उत्तरों के अनुसार, निम्नलिखित में जोड़ें someFile.js

module.exports.someFunction = function () {
  console.log('hi');
};

आप इसके बाद निम्न जोड़ सकते हैं package.json

"scripts": {
   "myScript": "node -e 'require(\"./someFile\").someFunction()'"
}

टर्मिनल से, फिर आप कॉल कर सकते हैं

npm run myScript

मुझे कमांड्स को याद करने और उनका उपयोग करने का यह बहुत आसान तरीका लगता है


मेरी Win10 मशीन पर, यह सिंटैक्स केवल स्क्रिप्ट (किसी पावरशेल या कमांड प्रॉम्प्ट टर्मिनल में) को प्रतिध्वनित कर रहा है। आवश्यकता पैरामीटर की शुरुआत की ओर इशारा करते हुए 'npm रन' थ्रो 'अनपेक्षित टोकन' के माध्यम से इसे सीधे चलाने के बजाय। मुझे पता नहीं चला है कि यह कैसे काम करता है।
काल्विनडेल

@CalvinDale यहाँ भी सिवाय इसके कि मैं स्क्रिप्ट को केवल शक्तियुक्त रूप से ठीक से चला सकूँ।
ferr

3
मेरी मशीन (विंडोज 10) पर मुझे डबल- और सिंगल-कोट्स को स्विच करना था, जैसे: "मायस्क्रिप्ट": "नोड-ई \ _" ('./ someFile') की आवश्यकता। someFunction () \ "" अन्यथा नोड। केवल एकल-उद्धरण के अंदर कमांड का प्रिंट आउट लें, लेकिन उसका मूल्यांकन न करें। शायद यह @CalvinDale और ferr के मुद्दों को हल करता है।
क्रिस्टोफ़

3
क्या होगा अगर हम फ़ंक्शन कॉल में एक तर्क जोड़ना चाहते हैं?
मिगुएल स्टीवंस

26

बनाने का प्रयास करें ।

Db.js में, require('make-runnable');अंत में जोड़ें ।

अब आप कर सकते हैं:

node db.js init

आगे किसी भी तरह से आर्गन को initविधि को पारित किया जाएगा ।


16

सीएलआई (वैश्विक) से सीधे चलाएँ

इंस्टॉल

npm i -g run-func

उपयोग अर्थात् रन फ़ंक्शन "इनिट", इसे निर्यात किया जाना चाहिए, नीचे देखें

run-func db.js init

या

Package.json स्क्रिप्ट (स्थानीय) से चलाएँ

इंस्टॉल

npm i -S run-func

सेट अप

"scripts": {
   "init": "run-func db.js init"
}

प्रयोग

npm run init

पैरामीटर

कोई भी निम्न तर्क फ़ंक्शन मापदंडों के रूप में पारित किया जाएगा init(param1, param2)

run-func db.js init param1 param2

जरूरी

फ़ंक्शन (इस उदाहरण में init) को फ़ाइल में निर्यात किया जाना चाहिए

module.exports = { init };

या ES6 निर्यात

export { init };

मैं उपयोग करने के लिए eye_mew के सुझाव का उपयोग करने के बारे में सोच रहा था make-runnable, लेकिन यह उससे बहुत बेहतर है, मुझे लगता है। धन्यवाद।
luis.espinal

@ luis.espinal मुझे खुशी है कि आप इसे उपयोगी पाते हैं। पृष्ठभूमि में कम जादू है और फ़ाइलों को संशोधित करने की कोई आवश्यकता नहीं है। जब तक किसी फंक्शन को एक्सपोर्ट नहीं किया जाता है, तब तक यह होना चाहिए, लेकिन यह नियमित ईएस 6 मॉड्यूल और उनके आयात / निर्यात की तरह तार्किक समझ रखता है।
पावेल

यह मेरे लिए काम नहीं करता है; $ रन- func db.js init bash: run-func: कमांड नहीं मिली
Patlatus

@Patatus पैकेज में स्क्रिप्ट के बिना सीएलआई से सीधे उपयोग करने के लिए। इसे विश्व स्तर पर स्थापित करेंnpm i -g run-func
पावेल

@Patatus वास्तव में एक बग था जो केवल इसे पैकेज के अंदर चलाने की अनुमति दे रहा था। स्क्रिप्ट स्क्रिप्ट। मैंने एक नया संस्करण अपलोड किया जो इसे ठीक करता है और यह विश्व स्तर पर भी काम करता है
पावेल

9

सरल तरीका:

मान लीजिए कि आपके पास प्रोजेक्ट संरचना में एक हेल्पर्स डायरेक्टरी में db.js फ़ाइल है।

अब हेल्पर्स डायरेक्टरी के अंदर जाएं और नोड कंसोल पर जाएं

 helpers $ node

2) db.js फ़ाइल की आवश्यकता है

> var db = require("./db")

3) अपने फ़ंक्शन को कॉल करें (आपके मामले में इसकी init ())

> db.init()

उम्मीद है की यह मदद करेगा


7

यदि आप db.jsएक मॉड्यूल में बदल जाते हैं, तो आपको इसकी आवश्यकता हो सकती है db_init.jsऔर बस node db_init.js:।

db.js:

module.exports = {
  method1: function () { ... },
  method2: function () { ... }
}

db_init.js:

var db = require('./db');

db.method1();
db.method2();

7

यह गंदा है लेकिन काम करता है :)

मैं main()अपनी स्क्रिप्ट से फंक्शन बुला रहा हूं। पहले मैं सिर्फ स्क्रिप्ट के अंत में मुख्य पर कॉल करता था। हालाँकि मैंने कुछ अन्य फ़ंक्शंस जोड़े और उन्हें स्क्रिप्ट से निर्यात किया (कोड के कुछ अन्य भागों में फ़ंक्शंस का उपयोग करने के लिए) - लेकिन मैं हर बार जब मैं अन्य स्क्रिप्ट्स में अन्य फ़ंक्शंस आयात करता हूं तो मैं मुख्य () फ़ंक्शन को निष्पादित नहीं करना चाहता।

तो मैंने ऐसा किया, अपनी स्क्रिप्ट में मैंने मुख्य () को कॉल हटा दिया, और स्क्रिप्ट के अंत में मैंने यह चेक डाल दिया:

if (process.argv.includes('main')) {
   main();
}

इसलिए जब मैं CLI में उस फ़ंक्शन को कॉल करना चाहता हूं: node src/myScript.js main


5

मैं एक IIFE करता हूं, कुछ ऐसा है:

(() => init())();

यह कोड तुरंत निष्पादित किया जाएगा और init फ़ंक्शन को लागू करेगा।


2
लेकिन अगर आप चलाते हैं: node init.jsऔर फ़ाइल में एक IIFE है तो यह काम करेगा। मुझे लगता है कि मैं आपके सवाल को पूरी तरह से नहीं समझ पाया। माफ़ करना।
नटन डिच

पूरी तरह से मिलता है, लेकिन अगर कोड में अन्य कार्य शामिल हैं, तो उन्हें बुलाया जा सकता है या नहीं
winhowes

आप चाहें (init)();तो इसे सरल भी बना सकते हैं :)
छोटी डो

1

कभी-कभी आप CLI के माध्यम से एक फ़ंक्शन चलाना चाहते हैं, कभी-कभी आप requireइसे किसी अन्य मॉड्यूल से चाहते हैं । यहाँ दोनों कैसे करना है।

// file to run
const runMe = () => {}
if (require.main === module) {
  runMe()
} 
module.exports = runMe

-2

जावास्क्रिप्ट फ़ाइल testfile.js में सरल:

module.exports.test = function () {
   console.log('hi');
};
this.test();

प्रॉम्प्ट पर चल रहा है:

node testfile.js

4
निश्चित रूप से, यह आपको JS फाइल चलाने की सुविधा देता है। मूल प्रश्न फ़ाइल के प्रवाह को बदलने के बिना उस फ़ाइल के अंदर एक विशिष्ट फ़ंक्शन को कॉल करने पर प्राप्त होता है (आपके उदाहरण testमें हर बार चलाया जाता है, इसलिए आपको फ़ाइल को किसी अन्य फ़ंक्शन को कॉल करने के लिए बदलना होगा)
winhowes

-3

यदि आपकी फ़ाइल में आपका फ़ंक्शन है, उदाहरण के लिए:

myFile.js:

function myMethod(someVariable) {
    console.log(someVariable)
}

कमांड लाइन से इसे इस तरह से कॉल करने से कुछ नहीं होगा:

node myFile.js

लेकिन अगर आप अपनी फ़ाइल बदलते हैं:

myFile.js:

myMethod("Hello World");

function myMethod(someVariable) {
    console.log(someVariable)
}

अब यह कमांड लाइन से काम करेगा:

node myFile.js

1
यकीन है, कि कैसे एक जेएस फ़ाइल चलाने के लिए है। यह सवाल अधिक था कि क्या मैं एक विशिष्ट फ़ंक्शन (कई संभावित कार्यों में से) चला सकता हूं, जहां केवल जेएस फाइल के बजाय कमांड लाइन इनपुट के लिए केवल परिवर्तन प्रति फ़ंक्शन कॉल था
winhowes 16:18

यह उस व्यक्ति के साथ व्यवहार नहीं कर रहा है जिसे वह व्यक्ति पूछ रहा है
jobmo

@jobmo यह है, वे cmd लाइन से एक विधि चलाना चाहते हैं, यह ऐसा करता है। (मैं स्वयं इस प्रश्न को भूलकर यहाँ आ गया, इसलिए कोई और व्यक्ति उत्तर की सराहना कर सकता है), चिंता न करें कि उत्तर के विविध सेट हैं जो आपको पसंद करने की अनुमति है
Blundell

वास्तव में, सवाल cmd लाइन से एक विधि चलाने के बारे में है। इस उत्तर में, myFile.js निष्पादित किया जाता है। यह क्या है। यह किसी भी फ़ंक्शन को निष्पादित नहीं कर रहा है। ऐसा तब होता है जब फ़ाइल में फ़ंक्शन होता है और फ़ंक्शन फ़ाइल के अंदर कहा जाता है। वह मेरी बात थी।
14

आपने अभी बताया कि उत्तर कमांड लाइन से फ़ंक्शन को निष्पादित करता है: +1:
ब्लंडेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.