Почему не работает загрузка файлов с сервера Node.js?

172
09 февраля 2019, 15:20

Есть локальный сервер:

const  
    express = require('express'), 
    server  = express(), 
    files   = [ 
        'Collapse.mp3', 
        'Eidolon.mp3' 
    ]; 
 
server.listen(8080); 
server.use(express.static('dist')); 
 
server.get('/', function(request, response) { 
    response.send(__dirname + '/dist/index.html'); 
    response.end(); 
}); 
 
for (var i = 0; i < files.length; i++) { 
    server.get('/dist/downloads/' + files[i], function(request, response) { 
        response.download(__dirname + '/dist/downloads/' + files[i]); 
    }); 
}

Но не понимаю почему не работает последний цикл для загрузки двух файлов. Выводил при помощи console.log, пути правильные, но при попытке загрузить пишет: Error: ENOENT: no such file or directory, stat 'D:\Documents\3-2_web_file_server\dist\downloads\undefined'.

При таком формате все работает:

server.get('/dist/downloads/Collapse.mp3', function(request, response) { 
    response.download(__dirname + '/dist/downloads/Collapse.mp3'); 
}); 
 
server.get('/dist/downloads/Eidolon.mp3', function(request, response) { 
    response.download(__dirname + '/dist/downloads/Eidolon.mp3'); 
});

Но так не хочется делать так как файлов может быть больше и для каждого не хочется писать отдельный запрос. Подскажите пожалуйста в чем проблема и как это правильнее реализовать. Спасибо.

Answer 1

В чём тут дело: переданная функция вызывается после того как цикл отработал и значение переменной i навсегда установилось равным 2. По такому индексу нет значения в массиве.

var files = ['Collapse.mp3', 'Eidolon.mp3']; 
for( var i = 0; i < files.length; ++i ) { 
  doSthWithCallbacks(`a-${files[i]}-b`, function() { 
     console.log(i, files[i]); 
  }); 
} 
 
function doSthWithCallbacks(str, cb) { 
  console.log(`str=${str}`); 
  setTimeout(cb, 200); 
}

Как это обойти - использовать let для объявления переменной i или:

var files = ['Collapse.mp3', 'Eidolon.mp3']; 
files.forEach((file) => { 
  doSthWithCallbacks(`a-${file}-b`, function() { 
    console.log(file); 
  }); 
}); 
 
 
function doSthWithCallbacks(str, cb) { 
  console.log(`str=${str}`); 
  setTimeout(cb, 200); 
}

READ ALSO
template в component ведет себя очень странно

template в component ведет себя очень странно

Ребят, вопрос очень странно такой задавать, но я негде не нашел никакой информации по поводу этого

199
Создание html элементов в компоненте react.js

Создание html элементов в компоненте react.js

У меня есть компонент, в который через props приходит целое число (каждый раз разное)Вопрос, как создать несколько блоков у компоненте в зависимости...

162
Долгий отклик сервера (Ubuntu+Apache+Nginx+Mysql+PHP)

Долгий отклик сервера (Ubuntu+Apache+Nginx+Mysql+PHP)

Столкнулся с проблемой - сервер выдачу делает 4,5 секунды

193
Незаполненные поля jinja2

Незаполненные поля jinja2

Вывожу данные в jinja2

183