fs.createReadStream получает путь, отличный от того, что передается в - PullRequest
0 голосов
/ 22 октября 2019

Я использую 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 ]

1 голос
/ 22 октября 2019

Код отлично работает. enter image description here

Я думаю, что ваш файл CONTENT.csv должен находиться в папке данных, например "/repo/directory/data/CONTENT.csv".

0 голосов
/ 01 ноября 2019

Я отвечаю на свой вопрос, потому что я нашел ответ, я не совсем уверен, почему это работает, и, по крайней мере, это интересно. Насколько я понимаю, это имеет отношение к стеку вызовов, и где 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', он работал без проблем.

...