fs.createReadStream获得的路径与传递的路径不同

时间:2019-10-22 14:50:19

标签: node.js csv fs

我在VM上使用NodeJS。它的一部分用于提供页面,另一部分是API。我遇到了一个问题,其中fs.createReadStream尝试访问的不同路径比传递给函数的路径要多。我做了一个小型测试服务器,以查看它是否由于某种原因影响了服务器path的使用,但它也在我的测试服务器上发生。首先,下面是代码:

const fs = require('fs');
const path = require('path');
const csv = require('csv-parser');

const readCSV = (filename) => {
  console.log('READ CSV GOT ' + filename); // show me what you got

  return new Promise((resolve, reject) => {
    const arr = [];
    fs.createReadStream(filename)
      .pipe(csv())
      .on('data', row => {
        arr.push(row);
      })
      .on('error', err => {
        console.log(err);
      })
      .on('end', () => {
        resolve(arr);
      });
  }
}

// tried this:
// const dir = path.relative(
//    path.join('path', 'to', 'this', 'file),
//    path.join('path', 'to', 'CONTENT.csv')
// );

// tried a literal relative path: 
// const dir = '../data/CONTENT.csv';

// tried a literal absolute path:
// const dir = '/repo/directory/server/data/CONTENT.csv';

// tried an absolute path:
const dir = path.join(__dirname, 'data', 'CONTENT.csv');

const content = readCSV(dir)
    .then(result => {console.log(result[0]);})
    .catch(err => {console.log(err);});

...但是以任何方式切片,都会得到以下输出:

READCSV GOT /repo/directory/server/data/CONTENT.csv
        throw er; // Unhandled 'error' event
        ^

Error: ENOENT: no such file or directory, open '/repo/directory/data/CONTENT.csv'

fs.createReadStream是否出于某种原因剥离了服务器的目录?我想我可以将目录硬编码到对createReadStream的调用中,也许吗?我只想知道为什么会这样。

一些额外的东西:我被困在v8.11节点上,不能再高了。在服务器本身上,我相信我使用的是较旧的function(param) {...}而不是箭头功能-但其行为完全相同。

请帮助!

2 个答案:

答案 0 :(得分:1)

代码是完美的作品。 enter image description here

我认为您的文件CONTENT.csv应该位于“ /repo/directory/data/CONTENT.csv”之类的数据文件夹中。

答案 1 :(得分:0)

我正在回答自己的问题,因为我找到了答案,但我不确定是为什么它起作用,至少还很有趣。据我估计,它与调用堆栈有关,NodeJS将其标识为函数调用的来源。我已经将服务器设置为MVC模式,因此我的主app.js在根目录中,正在调用的函数在/controllers文件夹中,并且我一直在尝试相对该文件夹中的路径-我仍然不确定为什么绝对路径不起作用。

调用堆栈进入:

app.js

app.use('/somepath', endpointRouter);

...然后在endpointRouter.js中输入

router.get('/request/file', endpointController.getFile);

...然后终于进入endpointController.js

const readCSV = filename => {
  //the code I shared
}
exports.getFile = (req, res, next) => {
  // code that calls readCSV(filename)
}

...而且我相信,由于Node将链视为来自app.js起源,因此它将根目录中的所有相对路径都视为与app.js相关。基本上,当我切换到超不直观的单点相对路径:'./data/CONTENT.csv'时,它毫无问题。