Node.js TypeError:路径必须是字符串或Buffer

时间:2018-08-04 15:43:01

标签: javascript node.js command-line

我正在编写一个命令行程序,该程序使用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新手,感谢您的帮助。 谢谢。

3 个答案:

答案 0 :(得分:2)

换行

enum DAY{MON = 1, TUE, WED, THU, FRI, SAT, SUN};

let stream = fs.createReadStream(program.list)

其中一些数字是您提及文件名的位置

例如使用以下命令运行程序

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

那么somenumber = 3

node test.js somevar filename

另一个错误:

最终代码如下

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

答案 1 :(得分:1)

听起来可能是glib,但是program.list是未定义的,这就是为什么您无法读取它的原因。它是未定义的,因为您尚未设置Commander来知道它如何从命令行映射。如果您查看commander documentation中的示例,则可能会提供更多帮助(并查看“可变参数”的帮助)。您可以按照this example来了解如何使用命令和操作方法。

我建议您只是开始,如果不需要,请不要使用Commander之类的软件包。您的问题确实与使用指挥官有关。 This question为如何获取命令行参数提供了一些很好的提示。

答案 2 :(得分:0)

具有以下目录结构:

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

您可以执行node orderPrices.js --list sample.catalog.csv使其生效。

如果CSV文件位于其他位置。您可以path模块的path.resolve函数以以下方式通过相对位置获取CSV文件。

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