web-dev-qa-db-ja.com

Node.js TypeError:パスは文字列またはバッファでなければなりません

CSVファイルの情報を使用して、注文の合計金額を計算するコマンドラインプログラムを作成しています。

sample.catalog.csv内のデータ

P1,5,1000.00
P2,8,250.00
P3,15,125.00
P4,10,250.00
P5,2,2500.00

また、プログラムはコマンドラインから次の引数を指定して実行する必要があります。

例:$ CalculateOrder sample.catalog.csv P1 2 P2 4

(P4 6 P10 5 P12 1は、csvファイルから入手可能な製品と数量です)

合計:4151,25

これは私が現在持っているものです:

var program = require('commander');
const csv = require('csv');
const fs = require('fs');


program
    .version('1.0.0')
    .option('-l, --list [list]', 'list of order prices in sample.catalog.csv')
    .parse(process.argv)

console.log("hello world")
console.log("list of order prices", program.list);


/* 
    To read csv file and print the data to the console:
    [node orderPrice --list input/sample.catalog.csv]
*/

let parse = csv.parse;
let stream = fs.createReadStream(program.list)
    .pipe(parse({ delimiter: ',' }));

var total = 0;
const vat = 23;
const totalWithVat = total * vat;

stream
.on('data', function (data) {
    let product = data[0];
    let quantity = data[1];
    let price = data[2];
    console.log(product, quantity, price);
    calculateOrder = () => {
        if (quantity > 20) {
            stream.destroy(new Error("Quantity exceeds stored amounts"));
        }
        total += price * quantity;
    }
})

.on("finish", function () {
    console.log("Total price:", totalWithVat);
})

.on("error", function (error) {
    console.error("The following error occured:", error);
})

次のエラーが発生しています。

λ node orderPrice calculateOrder sample.catalog.csv P1 2 P2 4
hello world
list of order prices undefined
fs.js:636
binding.open(pathModule._makeLong(path),
      ^

TypeError: path must be a string or Buffer
    at Object.fs.open (fs.js:636:11)
    at ReadStream.open (fs.js:1982:6)
    at new ReadStream (fs.js:1969:10)
    at Object.fs.createReadStream (fs.js:1923:10)
    at Object.<anonymous> (E:\order-price\orderPrice.js:31:17)
    at Module._compile (module.js:643:30)
    at Object.Module._extensions..js (module.js:654:10)
    at Module.load (module.js:556:32)
    at tryModuleLoad (module.js:499:12)
    at Function.Module._load (module.js:491:3)

私はNode.jsの初心者であり、どんな助けにも感謝しています。ありがとうございました。

6
RCohen

行を変更

let stream = fs.createReadStream(program.list)

let stream = fs.createReadStream(program.argv[some number])

ここで、いくつかの番号は、ファイル名を言及する位置です

例えば次のコマンドでプログラムを実行する

node test.js somevar filename

その後、somenumber = 3

0th param > node
1st param > test.js (file to run)
2nd > somevar
3rd > filename

別のエラー:

最終的なコードは次のようになります

const csv = require('fast-csv');
const fs = require('fs');

console.log("hello world")
console.log("list of order prices", process.argv[2]);
let required_products=[]
for(var i=3;i<process.argv.length;){
   let temp=[]
   temp.name=process.argv[i++]
   temp.quantity=process.argv[i++]
   required_products.Push(temp)
}
/*
    To read csv file and print the data to the console:
    [node orderPrice --list input/sample.catalog.csv]
*/

let stream = fs.createReadStream(process.argv[2]);

var total = 0;
var csvStream = csv()
    .on("data", function(data){
         let product_name = data[0];
         let quantity = data[1];
         let price = data[2];

         required_products.forEach(function(product){

             if(product['name']==product_name){
               if(parseInt(product['quantity'])>parseInt(quantity)){
                 console.log('Quantity required for product '+product['name']+' '+product['quantity']+' is greater than available '+quantity);
                 process.exit(1)
               }else{
                 total += parseInt(price) * parseInt(product['quantity']);
               }
             }
         })
    })
    .on("end", function(){
         console.log("done");
         let totalWithVat = total * (1+ 0.23);
         console.log("Total price:", totalWithVat);
    }).on("error", function (error) {
        console.error("The following error occured:", error);
    })
 stream.pipe(csvStream);
2
Shubham

それはglibに聞こえるかもしれませんが、program.listは定義されていないため、そこから読み取ることができません。コマンドラインからどのようにマッピングするかを知るためにコマンダーを設定していないため、未定義です。 コマンダーのドキュメント の例を確認すると、よりわかりやすくなる可能性があります(「さまざまな引数」のヘルプを参照してください)。コマンドおよびアクションメソッドの使用方法については この例 に従ってください。

始めたばかりの場合は、必要がない場合は司令官のようなパッケージを使用しないことをお勧めします。あなたの質問は本当に司令官を使うことです。 この質問 は、コマンドライン引数を取得する方法に関するいくつかの素晴らしいヒントを提供します。

1
Micromuncher

次のディレクトリ構造で:

_- .. - orderPrices.js - sample.catalog.csv_

_node orderPrices.js --list sample.catalog.csv_を実行して機能させることができます。

CSVファイルが別の場所にある場合。次の方法で、pathモジュールの_path.resolve_関数を使用して、CSVファイルの相対位置を取得できます。

fs.createReadStream(path.resolve(__dirname, program.list)

0
eskawl