Привет. Перед нами задача, реализовать в нашем API на KOA.js возможность скачивания файлов. Самый быстрый способ передать файл, особенно большой, это ипользовать технологию потоков (streams).
Выглядеть это будет так:
const Koa = require('koa');
const fs = require('fs');
const app = new Koa();
const path = require('path');
const extname = path.extname;
const port = 3000;
app.use(async function (ctx) {
const fpath = path.join(__dirname, ctx.path);
const fstat = await stat(fpath);
if (fstat.isFile()) { // проверка на то, что запрошен файл
ctx.type = extname(fpath);
// одной строкой отправляем поток чтения
// в поток ответа на запрос
ctx.body = fs.createReadStream(fpath);
}
});
app.listen(port);
console.log(`Started! Try http://localhost:${port}/README.md`);
function stat(file) {
return new Promise(function (resolve, reject) {
fs.stat(file, function (err, stat) {
if (err) {
reject(err);
} else {
resolve(stat);
}
});
});
}
Если в папку с таким скриптом поместить файл README.md, то при запросе http://localhost:3000/README.md вы получите содержимое этого файла.
Никто не сделает первый шаг, потому что каждый думает, что это не взаимно. Но потоки в node.js уже сделали шаг к тебе, так что теперь ты просто обязан шагнуть в их сторону.
Фёдор Достоевский, великий программист
Можно использовать и классический способ чтения файла fs.readFile или fs.readFileSync. Но это не очень хорошая идея, особенно для больших файлов. Преимущество использования потоков заключается в том, что отправляться клиенту большой файл будет частями, по мере чтения. Это даёт возможность экономить память и не иметь в связи с этим ограничений на размер файла.
Пользутесь потоками в node.js, это позволяет значительно повысить производительность!