it-swarm.com.de

Node.js TypeError: path muss eine Zeichenfolge oder ein Puffer sein

Ich schreibe ein Befehlszeilenprogramm, das den Gesamtpreis einer Bestellung anhand der Informationen aus einer CSV-Datei berechnet.

Daten in sample.catalog.csv :

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

Das Programm muss von der Befehlszeile aus mit den folgenden Argumenten ausgeführt werden:

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

(P4 6 P10 5 P12 1 sind Produkte und Mengen aus der CSV-Datei.)

Gesamt: 4151,25

Das habe ich im Moment:

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

Ich habe den folgenden Fehler:

λ 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)

Ich bin ein Neuling bei Node.js und ich freue mich über jede Hilfe. Vielen Dank.

3
RCohen

Zeile wechseln

let stream = fs.createReadStream(program.list)

zu 

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

wobei eine Zahl die Position ist, an der Sie Dateiname angeben

z.B. Programm mit folgendem Befehl ausführen

node test.js somevar filename

dann somenumber = 3

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

Noch ein Fehler:

Der endgültige Code wird aussehen

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

Es klingt vielleicht glib, aber program.list ist undefiniert, weshalb Sie nicht lesen können. Es ist undefiniert, weil Sie Commander nicht eingerichtet haben, um zu erfahren, wie er von der Befehlszeile aus zugeordnet wird. Wenn Sie die Beispiele in der commander-Dokumentation durchsehen, kann dies mehr Licht liefern (und die Hilfe für "variadische Argumente"). Sie können diesem Beispiel folgen, um Befehls- und Aktionsmethoden zu verwenden.

Ich empfehle, wenn Sie gerade erst anfangen, keine Pakete wie Commander zu verwenden, wenn Sie dies nicht brauchen. Ihre Frage bezieht sich wirklich auf die Verwendung des Kommandanten. Diese Frage enthält einige nützliche Hinweise, wie Sie Befehlszeilenargumente erhalten.

1
Micromuncher

Mit folgender Verzeichnisstruktur:

- .. - orderPrices.js - sample.catalog.csv

Sie können node orderPrices.js --list sample.catalog.csv Ausführen, damit es funktioniert.

Wenn sich Ihre CSV-Datei woanders befindet. Sie können die Funktion path.resolve Des Moduls path verwenden, um die CSV-Datei auf folgende Weise über ihre relative Position zu ermitteln.

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

0
eskawl