Трубопроводная (большая) загрузка CSV из базы данных Cloudant noSQL через Node.js в IBM Cloud не работает в производственной среде - PullRequest
0 голосов
/ 23 января 2019

Я разработал приложение в Node.js, и мне нужно загрузить необработанные данные из базы данных noSQL в облаке в формате CSV (Cloudant noSQL - IBM Cloud). Cloudant позволяет мне загружать все данные из базы данных через API . Я хочу, чтобы пользователь мог загрузить этот же файл, но через мое приложение Node.js . То, что я сделал, направил ответ от API базы данных на ответ клиента. Это прекрасно работает, когда я делаю это локально, но когда я загружаю приложение в IBM Cloud и пытаюсь загрузить тот же файл (40 МБ) никогда не загружается (но он работает с небольшими файлами, например 5 МБ).

Я пробовал 3 разных подхода, один с модулем запроса, а два других с модулем https.

1. Модуль запроса

    request({
      url: database.credentials.url + path,
      method: 'GET'
    }).pipe(res);

2. Модуль HTTPS (1-я попытка)

    res.setHeader('content-Type', 'text/csv');
    res.setHeader('transfer-encoding','chunked');
    res.setHeader('strict-transport-security','max-age=31536000');

    https.get(database.credentials.url + path, (csv_res) => {
      console.log('Download raw data db headers');
      console.log(csv_res.headers);

      csv_res.on('data', (d) => {
        res.write(d);
        process.stdout.write(".");
      });
      csv_res.on('end', () => {
        res.end();
      });
      }).on('error', (e) => {
        console.error(e);
      });

3. Модуль Https (вторая попытка)

    var options = {
      hostname:  database.credentials.host,
      port: 443,
      path: path,
      method: 'GET',
      headers: {
        'Authorization': 'Basic ' + new Buffer(database.credentials.username + ':' + database.credentials.password).toString('base64')
     }
    };
    var proxy = https.request(options, function (csv_res) {
      console.log(csv_res.headers)
      res.writeHead(csv_res.statusCode, csv_res.headers)
      csv_res.pipe(res, {
        end: true
      }).on('error', (e) => {
        console.log("ERROR piping to res: " + e)
      })
    });
    req.pipe(proxy, {
      end: true
    }).on('error', (e) => {
      console.log("ERROR piping from req" + e)
    })

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

1 Ответ

0 голосов
/ 12 февраля 2019

проверьте панель мониторинга, пока вы делаете это. Вы можете получить ограниченную скорость. Я также выкладываю утилиту, которая имеет функцию экспорта для cloudant, https://github.com/glynnbird/couchimport.

Если у вас есть дополнительные вопросы или проблемы, просто напишите нам о поддержке IBM Cloud, и мы поможем вам!

...