首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >fs.createReadStream得到了一条不同于正在传递的路径

fs.createReadStream得到了一条不同于正在传递的路径
EN

Stack Overflow用户
提问于 2019-10-22 14:50:19
回答 2查看 1.2K关注 0票数 0

我在VM上使用NodeJS。它的一部分为页面服务,另一部分是API。我遇到了一个问题,fs.createReadStream试图访问与传递给函数的路径不同的路径。我制作了一个小型测试服务器,以查看服务器中是否存在影响path使用的其他东西,不管出于什么原因,但它也发生在我的测试服务器上。首先,下面是代码:

代码语言:javascript
运行
复制
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);});

...but以任何方式分割它,我都会得到以下输出:

代码语言:javascript
运行
复制
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) {...},而不是箭头函数--但行为完全相同。

救命啊!!

EN

回答 2

Stack Overflow用户

发布于 2019-10-22 15:15:48

代码是完美的工作。

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

票数 1
EN

Stack Overflow用户

发布于 2019-11-01 01:39:43

我在回答我自己的问题,因为我找到了一个答案,我不完全确定它为什么会起作用,至少它很有趣。据我估计,这与调用堆栈有关,NodeJS将其标识为函数调用的起源。我的服务器安装在MVC模式中,所以我的主app.js位于根dir中,正在调用的函数位于/controllers文件夹中,我一直试图从该文件夹中执行相对路径--我仍然不知道为什么绝对路径不能工作。

调用堆栈如下:

app.js

代码语言:javascript
运行
复制
app.use('/somepath', endpointRouter);

...then in endpointRouter.js

代码语言:javascript
运行
复制
router.get('/request/file', endpointController.getFile);

...then终于在endpointController.js

代码语言:javascript
运行
复制
const readCSV = filename => {
  //the code I shared
}
exports.getFile = (req, res, next) => {
  // code that calls readCSV(filename)
}

...and --我相信,因为Node认为链起源于app.js,所以它会将所有相对路径处理为相对于app.js的根文件夹中的app.js。基本上,当我切换到超不直观的单点相对路径:'./data/CONTENT.csv'时,它没有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58506942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档