我正在VM上使用NodeJS。它的一部分用于提供页面,另一部分是API。我遇到了一个问题,其中fs.createReadStream
试图访问different路径而不是传递给函数的路径。我制作了一个小型测试服务器,以查看由于某种原因,服务器中是否还有其他因素会影响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) {...}
而不是箭头功能-但其行为完全相同。
请帮助!
我正在回答自己的问题,因为我找到了答案,所以我不完全确定为什么它起作用,而且至少很有趣。据我估计,它与调用堆栈有关,NodeJS将其标识为函数调用的来源。我已经将服务器设置为MVC模式,因此我的主app.js
位于根目录中,正在调用的函数位于/controllers
文件夹中,并且我一直在尝试从该文件夹中创建相对路径-我仍然不确定为什么绝对路径不起作用。
调用堆栈进入:
app.js
:
app.use('/somepath', endpointRouter);
...然后在endpointRouter.js
中:
router.get('/request/file', endpointController.getFile);
...然后终于出现在endpointController.js
中:
const readCSV = filename => {
//all the code
}
...而且我相信,因为Node从app.js
中将链视为originating,因此它将根文件夹中的所有相对路径都视为app.js
的相对路径。基本上,当我切换到超直观的单点相对路径:'./data/CONTENT.csv'
时,它没有问题。