Ошибка fs.readdir(): "Error: ENOENT: no such file or directory" при запуске приложения из другой папки
Когда запускаю программу на сервере из её папки (node index.js), все работает исправно.
Но, если запустить из другой директории (node /opt/webserver/index.js), выдает ошибку:
{ Error: ENOENT: no such file or directory, scandir './routers',
errno: -2,
code: 'ENOENT',
syscall: 'scandir',
path: './routers' }
fs.readdir('./routers', (error, files) => {
if(error) return console.log(error);
files.forEach(file => {
app.use(require(`./routers/${file}`));
});
});
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
Чтобы понять что происходит, надо написать маленький скрипт и позапускать из разных мест:
const path = require('path');
console.log(`cwd=${process.cwd()}, dirname=${__dirname}`);
console.log(`path1=${path.resolve('./routes')}, path2=${path.resolve(__dirname, './routes')}`);
Результат:
:~ $ node tmp/q/src/dirname.js
cwd=/Users/z, dirname=/Users/z/tmp/q/src
path1=/Users/z/routes, path2=/Users/z/tmp/q/src/routes
Видно, что ./routes "резолвятся" от места запуска программы.
Нужно добавить использование глобальной переменной __dirname, чтобы "резолвить" от местоположения запущенного файла.
Например, так:
const routersPath = path.resolve(__dirname, './routes');
fs.readdir(routersPath, (error, files) => {
if(error) return console.log(error);
files.forEach(file => {
app.use(require(`${routersPath}/${file}`));
});
});