【问题标题】:fs.createReadStream getting a different path than what's being passed infs.createReadStream 获得的路径与传入的路径不同
【发布时间】:2020-02-18 18:16:52
【问题描述】:

我在虚拟机上使用 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) {...} 而不是箭头函数——但行为完全相同。

请帮忙!!

【问题讨论】:

    标签: node.js csv fs


    【解决方案1】:

    我正在回答我自己的问题,因为我找到了答案,我不完全确定它为什么有效,至少它很有趣。据我估计,这与调用堆栈有关,并且 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',它没有问题。

    【讨论】:

      【解决方案2】:

      代码完美运行。

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

      【讨论】:

      • hmmm...不知道为什么我的失败了,然后 - 它在我的 /data 文件夹中...
      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2011-01-10
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多