web-dev-qa-db-fra.com

Node.js TypeError: le chemin doit être une chaîne ou un tampon

J'écris un programme en ligne de commande qui calcule le prix total d'une commande en utilisant les informations d'un fichier CSV.

Données dans sample.catalog.csv :

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

Et le programme doit être exécuté à partir de la ligne de commande avec les arguments suivants:

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

(P4 6 P10 5 P12 1 sont des produits et quantités disponibles dans le fichier csv)

Total: 4151,25

Voici ce que j'ai pour le 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);
})

J'ai l'erreur suivante:

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

Je suis un débutant chez Node.js et toute aide est appréciée ... Merci.

3
RCohen

Changer de ligne

let stream = fs.createReadStream(program.list)

à 

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

où un certain nombre est la position à laquelle vous mentionnez le nom de fichier

par exemple. lancer le programme avec la commande suivante

node test.js somevar filename

alors nombre = 3

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

Une autre erreur:

Le code final ressemblera à

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

Cela peut sembler simple, mais program.list n'est pas défini, c'est pourquoi vous ne pouvez pas le lire. Il n’est pas défini car vous n’avez pas configuré Commandant pour savoir comment il se mappe à partir de la ligne de commande. Si vous examinez des exemples dans documentation de commandant , cela peut fournir plus de lumière (et consultez l'aide relative aux "arguments variadiques"). Vous pouvez suivre cet exemple sur l'utilisation des méthodes de commande et d'action.

Je vous recommande, si vous commencez tout juste, de ne pas utiliser de progiciels tels que commander si vous n'en avez pas besoin. Votre question concerne vraiment l'utilisation de commandant. Cette question fournit d'excellentes indications sur la manière d'obtenir des arguments en ligne de commande.

1
Micromuncher