Câu hỏi Làm cách nào để chuyển đối số dòng lệnh cho chương trình Node.js?


Tôi có một máy chủ web được viết bằng Node.js và tôi muốn khởi chạy với một thư mục cụ thể. Tôi không chắc cách truy cập các đối số trong JavaScript. Tôi đang chạy nút như thế này:

$ node server.js folder

đây server.js là mã máy chủ của tôi. Node.js giúp nói rằng điều này là có thể:

$ node -h
Usage: node [options] script.js [arguments]

Làm cách nào để truy cập vào các đối số trong JavaScript? Bằng cách nào đó tôi không thể tìm thấy thông tin này trên web.


1775
2017-12-04 01:56


gốc




Các câu trả lời:


Phương pháp chuẩn (không có thư viện)

Các đối số được lưu trữ trong process.argv

Đây là các tài liệu nút trên xử lý dòng lệnh args:

process.argv là một mảng chứa các đối số dòng lệnh. Phần tử đầu tiên sẽ là 'nút', phần tử thứ hai sẽ là tên của tệp JavaScript. Các phần tử tiếp theo sẽ là bất kỳ đối số dòng lệnh bổ sung nào.

// print process.argv
process.argv.forEach(function (val, index, array) {
  console.log(index + ': ' + val);
});

Điều này sẽ tạo ra:

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four

2356
2017-12-04 02:05



Vâng. cảm ơn. console.log (process.argv [2]); in thư mục của tôi - milkplus
Tôi nên gõ gì vào dấu nhắc lệnh để chạy một kịch bản lệnh node.js với các đối số dòng lệnh? - Anderson Green
CẬP NHẬT: Tôi tìm thấy câu trả lời cho câu hỏi trên. stackoverflow.com/questions/12925802/… - Anderson Green
Minimist là một trình phân tích cú pháp đối số tuyệt vời và đơn giản - Guilherme Nagatomo
Bạn cũng có thể truy cập một đối số khi bạn biết vị trí của nó: process.argv[n] Ở đâu n là chỉ mục dựa trên 0 - Luca Steeb


Để bình thường hóa các đối số như một hàm javascript thông thường sẽ nhận được, tôi thực hiện điều này trong các kịch bản shell node.js của mình:

var args = process.argv.slice(2);

Lưu ý rằng arg đầu tiên thường là đường dẫn đến nodejs và arg thứ hai là vị trí của tập lệnh bạn đang thực hiện.


479
2018-04-23 23:13



Cảm ơn Jaseem. Rất thích nhìn thấy nơi đó được viết trong spec tương lai. Nó sẽ phá vỡ rất nhiều thư viện js ... - Mauvis Ledford
Câu trả lời này hữu ích hơn tôi so với câu trả lời đầu tiên trực tiếp từ tài liệu NodeJS. Ít nhất nó đã giúp tôi hoàn thành những gì tôi đang tìm kiếm. - JohnAllen
Chỉ cần một lưu ý rằng tôi đã viết câu trả lời này cách đây 4 năm và mã tôi đang chạy vẫn chạy 100% tiền phạt ngày hôm nay. Vẫn giữ cho đến ngày với các phiên bản mới nhất của nút và vẫn không có vấn đề gì: Nó chỉ là một shell script đơn giản. Không phải là một phần của một đối tượng toàn cầu lớn có đầy đủ các thư viện JS. Tôi vẫn đứng sau câu trả lời của tôi hôm nay. Tôi sẽ đưa ra một bản cập nhật khác trong 4 năm nữa. - Mauvis Ledford
var args = process.argv.splice(process.execArgv.length + 2); // vì có các ngoại lệ về cách sử dụng lệnh nút, ví dụ: node --harmony script.js balala. xem process.execArgv - cuixiping
@cuixiping nhưng execArgv là không phải trong argv do đó, 2 là đủ - Tommi Kyntola


Cập nhật đúng trả lời cho nó để sử dụng tối thiểu thư viện. Chúng tôi đã từng sử dụng người lạc quan về nút nhưng nó đã bị từ chối.

Dưới đây là một ví dụ về cách sử dụng nó được lấy trực tiếp từ tài liệu minimist:

var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);

- -

$ node example/parse.js -a beep -b boop
{ _: [], a: 'beep', b: 'boop' }

- -

$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
{ _: [ 'foo', 'bar', 'baz' ],
  x: 3,
  y: 4,
  n: 5,
  a: true,
  b: true,
  c: true,
  beep: 'boop' }

239
2017-07-08 17:26



Trên thực tế, giải pháp này hữu ích hơn cho việc phát triển công cụ dòng lệnh với nhiều cờ và đối số hơn, và nên được tăng thêm IMHO. - JK ABC
Imo, đây là một lựa chọn đơn giản hơn để npmjs.com/package/command-line-args - klodoma
@ JKABC Tôi sẽ không gọi đây là câu trả lời đúng nhất, vì OP chỉ yêu cầu truy cập thông tin dòng lệnh tầm thường. Nhưng tôi đồng ý rằng cả minimist và command-line-args đều rất hữu ích nếu bạn đang có kế hoạch mở rộng CLI của mình. - Justus Romijn
Tôi tự hỏi tại sao '-n5' không tạo ra 'n5: true' - điều đó có ý nghĩa với tôi. - Max Waterman
@MaxWaterman: bởi vì các tùy chọn bắt đầu bằng một dấu gạch ngang đơn lẻ chỉ được coi là một ký tự đơn. Bất cứ điều gì mà sau một tùy chọn char duy nhất được thực hiện như là một đối số cho các tùy chọn (không có không gian cần thiết). Bắt đầu tùy chọn có hai dấu gạch ngang (tức là - n5) sẽ tạo 'n5: true'. Đây là hành vi khá chuẩn đối với hầu hết các công cụ dòng lệnh Unix (nhưng không phải tất cả là không may). - Menno Smits


2018 câu trả lời dựa trên xu hướng hiện tại trong tự nhiên:


Phân tích cú pháp đối số javascript của vanilla:

const args = process.argv;
console.log(args);

Điều này trả về:

$ node server.js one two=three four
['node', '/home/server.js', 'one', 'two=three', 'four']

Tài liệu chính thức


Hầu hết các gói NPM được sử dụng để phân tích cú pháp đối số:

Minimist: Đối với phân tích đối số tối thiểu.

Commander.js: Mô-đun được sử dụng nhiều nhất để phân tích đối số.

meo: Thay thế nhẹ hơn cho Commander.js

Yargs: Phân tích đối số phức tạp hơn (nặng).

Vorpal.js: Các ứng dụng dòng lệnh tương tác / trưởng thành với phân tích đối số.


204
2018-01-14 05:26



Yargs là một cái rất tốt - ForzaGreen
"$ npm install -g yargs" đã mang lại 1,9 MB mã JavaScript. Khi nào thì sự điên rồ này sẽ kết thúc khi một thư viện phân tích cú pháp argv cần hai megabyte mã? Tăng bề mặt tấn công, lãng phí RAM, v.v ... - joonas.fi
Yargs là một công cụ lớn hơn cũng xảy ra để phân tích đối số dòng lệnh. Không điên rồ, thiếu thông tin. Nếu bạn muốn một cái gì đó nhẹ hơn, hãy sử dụng JS thô, Meow hoặc Minimist. - dthree
thiếu nconf - Michael
"$ npm i yargs" -> 800 KB ở đây, tôi đoán chủ sở hữu gói cuối cùng đã học được cách bỏ qua các tệp không liên quan. Dù sao, vẫn còn lớn cho các dự án ngớ ngẩn, nhưng nhỏ khi bạn cần sự vững mạnh và trên các dự án lớn hơn bạn đã có phụ thuộc .. - Andre Figueiredo


Optimist (nút lạc quan)

Kiểm tra thư viện lạc quan, nó tốt hơn nhiều so với phân tích cú pháp các tùy chọn dòng lệnh bằng tay.

Cập nhật

Optimist không được dùng nữa. Thử yargs đó là một ngã ba tích cực của người lạc quan.


108
2017-07-04 04:02



+1 cho liên kết. Có khá nhiều danh sách các trình phân tích cú pháp tùy chọn dòng lệnh tại github.com/joyent/node/wiki/modules#wiki-parsers-commandline - Thilo
Điều này không được chấp nhận. Yargs là một ngã ba của lạc quan. github.com/chevex/yargs - Nikolay Yordanov
Minimist là một người kế nhiệm khác cho người lạc quan không còn được chấp nhận. Đó là "sự can đảm của trình phân tích đối số của người lạc quan mà không có tất cả các trang trí huyền ảo." 23 triệu lượt tải xuống trong tháng trước (tính đến tháng 12/2015). - aap


Một số câu trả lời tuyệt vời ở đây, nhưng tất cả có vẻ rất phức tạp. Điều này rất giống với cách bash script truy cập các giá trị đối số và nó đã được cung cấp chuẩn với node.js như MooGoo đã chỉ ra. (Chỉ để làm cho nó dễ hiểu với ai đó mới mẻ đối với node.js)

Thí dụ:

$ node yourscript.js banana monkey

var program_name = process.argv[0]; //value will be "node"
var script_path = process.argv[1]; //value will be "yourscript.js"
var first_value = process.argv[2]; //value will be "banana"
var second_value = process.argv[3]; //value will be "monkey"

69
2017-12-12 05:19





Commander.js

Hoạt động tốt để xác định các tùy chọn, hành động và đối số của bạn. Nó cũng tạo ra các trang trợ giúp cho bạn.

Nhanh chóng

Hoạt động tốt để nhận dữ liệu nhập từ người dùng, nếu bạn thích cách gọi lại.

Đồng ý

Hoạt động tuyệt vời để nhận dữ liệu đầu vào từ người dùng, nếu bạn thích phương pháp tạo máy phát.


66
2017-09-20 10:20



@Evan Carroll xin vui lòng không chỉnh sửa câu trả lời của tôi để quảng bá một thư viện mà tôi không sử dụng stackoverflow.com/posts/7483600/revisions đặc biệt là vì một tính năng bị thiếu mà bạn đang theo dõi, các ý kiến ​​như vậy nên được lưu lại cho các nhận xét hoặc yêu cầu kéo đối với các tác giả mô-đun, chứ không phải các chỉnh sửa đối với các câu trả lời của người khác. - balupton
Commander.js thực sự đã giúp tôi. Các thư viện khác sẽ không làm việc với trình biên dịch nexe nhưng điều này thực hiện thủ thuật. Nếu bạn muốn nhận được args khi sử dụng nexe, hãy chắc chắn để vượt qua -f để trình biên dịch nexe. - pierce.jason
Commander.js Extreamelly dễ dàng !!! - aemonge


Thư viện Stdio

Cách dễ nhất để phân tích đối số dòng lệnh trong NodeJS là sử dụng stdio mô-đun. Lấy cảm hứng từ UNIX getopt tiện ích, nó là tầm thường như sau:

var stdio = require('stdio');
var ops = stdio.getopt({
    'check': {key: 'c', args: 2, description: 'What this option means'},
    'map': {key: 'm', description: 'Another description'},
    'kaka': {args: 1, mandatory: true},
    'ooo': {key: 'o'}
});

Nếu bạn chạy mã trước đó bằng lệnh này:

node <your_script.js> -c 23 45 --map -k 23 file1 file2

Sau đó ops đối tượng sẽ như sau:

{ check: [ '23', '45' ],
  args: [ 'file1', 'file2' ],
  map: true,
  kaka: '23' }

Vì vậy, bạn có thể sử dụng nó như bạn muốn. Ví dụ:

if (ops.kaka && ops.check) {
    console.log(ops.kaka + ops.check[0]);
}

Tùy chọn nhóm cũng được hỗ trợ, vì vậy bạn có thể viết -om thay vì -o -m.

Hơn nữa, stdio có thể tự động tạo đầu ra trợ giúp / sử dụng. Nếu bạn gọi ops.printHelp() bạn sẽ nhận được những điều sau đây:

USAGE: node something.js [--check <ARG1> <ARG2>] [--kaka] [--ooo] [--map]
  -c, --check <ARG1> <ARG2>   What this option means (mandatory)
  -k, --kaka                  (mandatory)
  --map                       Another description
  -o, --ooo

Thông điệp trước đó cũng được hiển thị nếu một tùy chọn bắt buộc không được đưa ra (trước thông báo lỗi) hoặc nếu nó được xác định sai (ví dụ, nếu bạn chỉ định một arg cho một tùy chọn và nó cần 2).

Bạn có thể cài đặt stdio module sử dụng NPM:

npm install stdio

36
2017-08-13 10:30



Theo TOS của SO, điều đáng nói đến là @sgmonda là người bảo trì duy nhất của mô-đun; Chắc chắn hữu ích. - Qix
Thực sự hữu ích, mặc dù bản cập nhật gần đây nhất là ngày 30 tháng 12 năm 2014. Có thể không được duy trì tốt như một số gói khác. - fearless_fool
lib tốt đẹp! tks! nó hoàn toàn cập nhật gần đây .. Nó có đủ chức năng tốt - Pablo Ezequiel