কমান্ড লাইন (নোড জেএস) থেকে স্ক্রিপ্টে ফাংশন চালান


204

আমি নোডে একটি ওয়েব অ্যাপ লিখছি। যদি আমি এতে কোনও db.jsফাংশন সহ কিছু জেএস ফাইল পেয়েছি তবে আমি initকীভাবে কমান্ড লাইন থেকে সেই ফাংশনটি কল করতে পারি?


এনপিএম রান-ফানক স্ট্যাকওভারফ্লো.com/a/43598047/ 696535
পাভেল

3
@ পাওয়েল আমি স্বীকৃত উত্তর পছন্দ করি কারণ এর জন্য তৃতীয় পক্ষের নির্ভরতা ইনস্টল করার দরকার নেই যা হয় সমর্থন হারাতে পারে বা দুর্বলতা থাকতে পারে। এটি যে কোনও ঝুঁকির সাথে আপনি যে কোনও নির্ভরতা নিয়ে চালিত হন, তাই নির্ভরযোগ্যতাগুলি ভাল পরীক্ষিত এবং বজায় রাখাগুলির মধ্যে সীমাবদ্ধ করা সর্বদা একটি ভাল ধারণা।
উইনহোয়েস

উত্তর:


329

আপনি কেন এটি করতে চান তা বা কোনও আরও আদর্শ মানের অনুশীলন কী হতে পারে সে সম্পর্কে কোনও মন্তব্য নয়: এখানে আপনার প্রশ্নের সমাধান রয়েছে in মনে রাখবেন যে আপনার কমান্ড লাইনের দ্বারা প্রয়োজনীয় উক্তিগুলি বিভিন্ন রকম হতে পারে।

আপনার মধ্যে db.js, initফাংশন রফতানি । অনেকগুলি উপায় রয়েছে তবে উদাহরণস্বরূপ:

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

তারপরে db.jsআপনার কমান্ড প্রম্প্টের একই ডিরেক্টরিতে রয়েছে তা ধরে নিয়ে এটিকে ডাকুন :

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

অন্যান্য পাঠকদের জন্য, ওপি-র কার্যটি যে initকোনও কিছু বলা যেতে পারে, এটি গুরুত্বপূর্ণ নয়, এটি কেবলমাত্র প্রশ্নে ব্যবহৃত নির্দিষ্ট নাম।


80
অ্যাডাব্লুএস ল্যাম্বদা থেকে চলমান কিছু জাভাস্ক্রিপ্ট পরীক্ষার জন্য এটি একটি দরকারী পরামর্শ ছিল - ধন্যবাদ
অ্যালেক্স হিন্টন

14
যদি ফাংশনটি অ্যাসিঙ্ক হয় তবে কী হবে?
অগস্টিন রিডিংগার

24
এনপিএম স্ক্রিপ্ট হিসাবে অন্য কেউ যদি তাদের প্যাকেজ.জসনে এটি করার চেষ্টা করছে, আমি ভিতরে একক উদ্ধৃতি এবং ডাবল উদ্ধৃতি দিয়ে চেষ্টা করেছি, তবে আমি সেগুলি পরিবর্তন না করা পর্যন্ত এটি কার্যকর হয়নি: "শুরু": "নোড - e \ "প্রয়োজনীয় ('./ সার্ভার') () \" ",
সাকো73

2
আপনার উত্তর দেওয়ার জন্য ধন্যবাদ @winhowes, আমি শুধু আপনার উদাহরণ ব্যবহার করা module.exports.init = function () { console.log('hi'); };আর node -e 'require("./db").init()'একরকম আমার জন্য কাজ করে নি। আমি কী ভুল করেছি তা নিশ্চিত নই, তবে আপনার ধারণাকে অনুসরণ করে আমি ব্যবহার করেছি module.exports = myFunction, এবং তারপরে node -e 'require("./myFunction")()'আমার পক্ষে কাজ করেছি।
সি .লাই

3
@ AlexHinton এর মন্তব্যের একটি বৃদ্ধি হিসাবে, আমি এখন একটি ইভেন্ট এবং কলব্যাক mimick নিম্নলিখিত ব্যবহার করুন: node -e 'require("./index").handler(require("./fixtures/sample_event_01.json"), {}, console.log)'। মাঝেরটি {}প্রসঙ্গ হবে, বিনা দ্বিধায় সমন্বয় করুন। এছাড়াও কনসোল.লগ কিছুটা আদিম তবে একটি দুর্দান্ত শুরু। অবশ্যই আপনি একটি উত্সর্গীকৃত CLI.js লিখতে পারেন যা পরিবর্তে () এর সূচক প্রয়োজন sjs / হ্যান্ডলার হিসাবে অন্যান্য মন্তব্যে বর্ণিত।
অ্যাড্রিয়ান ফেডার

50

অন্যান্য উত্তর অনুসারে, নিম্নলিখিতটি যুক্ত করুন someFile.js

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

তারপরে আপনি নিম্নলিখিতটি যুক্ত করতে পারেন package.json

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

টার্মিনাল থেকে, আপনি কল করতে পারেন

npm run myScript

কমান্ডগুলি মনে রাখার এবং সেগুলি ব্যবহার করার জন্য আমি এটি একটি আরও সহজ উপায়


আমার উইন 10 মেশিনে, এই সিনট্যাক্সটি সহজেই স্ক্রিপ্টটি প্রতিধ্বনি করছে (কোনও পাওয়ারশেল বা কমান্ড প্রম্পট টার্মিনালের মধ্যে)। 'এনএমপি রান' এর পরিবর্তে এটি সরাসরি চালানো প্রয়োজনীয় প্যারামিটারের সূচনার দিকে ইঙ্গিত করে 'অপ্রত্যাশিত টোকেন' ফেলে দেয়। কীভাবে এটি কাজ করবে তা আমি এখনও বুঝতে পারি নি।
ক্যালভিনডেল

ক্যালভিনডেলকে এখানে ক্লিক করুন তবে আমি স্ক্রিপ্টটি নিজেই চালাতে পারি।
ferr

3
আমার মেশিনে (উইন্ডোজ 10) আমাকে ডাবল এবং একক উদ্ধৃতিগুলি পরিবর্তন করতে হয়েছিল, এর মতো: "মাইস্ক্রিপ্ট": "নোড -e require" প্রয়োজন ('। / কিছু ফাইল') some কেবল একক উদ্ধৃতিতে কমান্ডটি মুদ্রণ করুন তবে তা মূল্যায়ন করবেন না। সম্ভবত এটি @ ক্যালভিনডেল এবং ফেরারের সমস্যাগুলি সমাধান করে।
ক্রিস্টোফ

3
যদি আমরা ফাংশন কলে একটি যুক্তি যুক্ত করতে চাই?
মিগুয়েল স্টিভেনস

26

চালানোর চেষ্টা করুন

Db.js এ, require('make-runnable');শেষে যুক্ত করুন।

এখন আপনি এটি করতে পারেন:

node db.js init

পরবর্তী কোনও আরোগুলি initপদ্ধতিতে পাস হবে ।


16

সরাসরি সিএলআই থেকে চালান (গ্লোবাল)

ইনস্টল করুন

npm i -g run-func

ব্যবহার অর্থাৎ রান ফাংশন "init", এটি রফতানি করতে হবে, নীচে দেখুন

run-func db.js init

অথবা

প্যাকেজ.জসন স্ক্রিপ্ট থেকে চালান (স্থানীয়)

ইনস্টল করুন

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 };

আমি আই_মিউ'র পরামর্শটি ব্যবহার করার জন্য ভাবছিলাম make-runnable, তবে এটি এর থেকে অনেক ভাল me ধন্যবাদ।
luis.espinal

@ luis.espinal আপনি এটি দরকারী বলে খুশী glad পটভূমিতে কম যাদু রয়েছে এবং ফাইলগুলি সংশোধন করার প্রয়োজন নেই। যদি কোনও ফাংশন রফতানি না করা হয় তবে তা হওয়া দরকার তবে এটি নিয়মিত ইএস 6 মডিউল এবং তাদের আমদানি / রফতানির মতো যৌক্তিক অর্থে তৈরি করে।
পাভেল

এটি আমার পক্ষে কাজ করে না; $ run-func db.js init bash: রান-
ফানক

@ প্যাট্লটাস প্যাকেজ-স্ক্রিপ্ট ছাড়াই সিএলআই থেকে সরাসরি ব্যবহার করতে পারবেন।জসন এটি বিশ্বব্যাপী ইনস্টল করুনnpm i -g run-func
পাভেল

@ প্যাট্লাস আসলে একটি বাগ ছিল যা এটি কেবল প্যাকেজ.জসন স্ক্রিপ্টের অভ্যন্তরে চালানোর অনুমতি দিচ্ছিল। আমি একটি নতুন সংস্করণ আপলোড করেছি যা এটি সংশোধন করে এবং এটি বিশ্বব্যাপীও কার্যকর হয়
পাভেল

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

আমি একটি আইআইএফই করি, এরকম কিছু:

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

এই কোডটি তাত্ক্ষণিকভাবে কার্যকর করা হবে এবং আরআর ফাংশনটি অনুরোধ করবে।


2
তবে আপনি যদি চালনা করেন: node init.jsএবং ফাইলটিতে একটি আইআইএফই রয়েছে এটি কাজ করবে। আমি মনে করি আপনার প্রশ্নটি আমি পুরোপুরি বুঝতে পারি নি। দুঃখিত।
নাটান দেইচ

পুরোপুরি এটি পান, তবে
কোডটিতে

আপনি চাইলে এটিকে এমনকি সরল (init)();করতে পারেন :)
ছোট

1

কখনও কখনও আপনি সি এল এলির মাধ্যমে কোনও ফাংশন চালাতে চান, কখনও কখনও আপনি requireএটি অন্য মডিউল থেকে করতে চান । উভয় কীভাবে করবেন তা এখানে।

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

-2

সরল, জাভাস্ক্রিপ্ট ফাইল টেস্টফিল.জেজে:

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

প্রম্পটে চলছে:

node testfile.js

4
অবশ্যই, এটি আপনাকে একটি জেএস ফাইল চালাতে দেয়। আসল প্রশ্নটি ফাইলের প্রবাহ পরিবর্তন না করেই সেই ফাইলটির অভ্যন্তরে একটি নির্দিষ্ট ফাংশনটি কল করতে পারে (আপনার উদাহরণে testপ্রতিবার চালানো হয়, সুতরাং আপনাকে অন্য ফাংশনটি কল করার জন্য ফাইলটি পরিবর্তন করতে হবে)
উইনহাউস

-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
অবশ্যই, জেএস ফাইল চালানোর উপায় এটি। প্রশ্নটি আরও লক্ষ্যযুক্ত ছিল যে আমি একটি নির্দিষ্ট ফাংশন (অনেকগুলি সম্ভাব্য ফাংশনগুলির মধ্যে) চালাতে পারি কিনা যেখানে ফাংশন কল অনুযায়ী জেএস ফাইলের পরিবর্তে কমান্ড লাইন
ইনপুটটিতে

এটি সেই ব্যক্তির যে
দৃশ্যের

@ জোবমো এটি হ'ল তারা সিএমডি লাইন থেকে একটি পদ্ধতি চালাতে চান, এটি এটি করে। (আমি নিজেই প্রশ্নটি গুগল করে এখানে এসেছি, যাতে অন্য কেউ উত্তরটির প্রশংসা করতে পারে), ভেবে দেখবেন না যে বিভিন্ন উত্তর রয়েছে যা আপনার পছন্দ করার অনুমতি
ব্লুন্ডেল

হুবহু, প্রশ্নটি সেমিডি লাইন থেকে কোনও পদ্ধতি চালানোর বিষয়ে। এই উত্তরে, myFile.js কার্যকর করা হয়েছে hat এটি এটি। এটি কোনও কার্য সম্পাদন করছে না। এটি তখন ঘটে যে ফাইলটির একটি ফাংশন রয়েছে এবং ফাংশনটিকে ফাইলের ভিতরে ডাকা হয়। আমার বক্তব্য ছিল।
জবমো

আপনি কেবল ব্যাখ্যা করেছেন যে উত্তরটি কমান্ড লাইন থেকে ফাংশনটি সম্পাদন করে: +1:
ব্লুন্ডেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.