Используйте функцию Firebase с ошибкой TypeError - PullRequest
0 голосов
/ 05 января 2019

Я очень новичок в Node js, я просто хочу получить данные из extenal xml с веб-сайта, но я получил ошибку из журнала функций Firebase TypeError: недопустимый тип носителя. Я думаю, что это происходит, когда я пытаюсь выполнить эту задачу parseString(xml, function(err, result) { })

Любой может мне помочь, это будет здорово:

Вот мой код функции firebase:

exports.getRate = functions.https.onRequest((req, res) => {
  getRate = () => {
    var url = "https://www.vietcombank.com.vn/ExchangeRates/ExrateXML.aspx";
    https.get(url, function(res) {
      var xml = "";
        res.on('error', function(error){
            console.log(error, 'get data error');

        })
      res.on("data", function(chunk) {
        xml += chunk;
        console.log(xml, 'xml file');
      });
      res.on("end", function() {
        var date = "";
        let rateAUD = {
            code: 'AUD/VND',
            buy: 0,
            sell: 0
          };
          let rateUSD = {
            code: 'USD/VND',
            buy: 0,
            sell: 0
          };
        parseString(xml, function(err, result) {
            console.log(xml, 'xml file');

          date = result.ExrateList.DateTime[0];
          if (result.ExrateList.Exrate[0].$.CurrencyCode == "AUD") {
            rateAUD.buy = result.ExrateList.Exrate[0].$.Buy;
            rateAUD.sell = result.ExrateList.Exrate[0].$.Sell;
          } else {
            console.log("They change the database list");
          }
          if (result.ExrateList.Exrate[18].$.CurrencyCode == "USD") {
            rateUSD.buy = result.ExrateList.Exrate[18].$.Buy;
            rateUSD.sell = result.ExrateList.Exrate[18].$.Sell;
          } else {
            console.log("They change the database list");
          }
          console.log(rateAUD, rateUSD, 'get data');
          uploadDataToServer(date, { rateAUD, rateUSD });
          if(err) {
              console.log(err);
          }
        });
      });
    });
  };

  function uploadDataToServer(date, { rateAUD, rateUSD }) {
    var db = admin.firestore();

    let data = { rateAUD, rateUSD };
    data.timeStamp = date;
    console.log('upload success');

    db.collection("liveRate").add(data),then((err)=> {
        console.log(err);

    });
  }
  return res.status(200)
  .type('application / json')
  .send('hello')
});

Когда я запускаю тот же код на другой площадке Nodejs, он работает хорошо. Вот ссылка: https://repl.it/repls/MaroonSlateblueProfiler Так странно! Ps: мой способ оплаты включен.

1 Ответ

0 голосов
/ 05 января 2019

Проблема в том, что клиент отправляет серверу то, что может или не может быть допустимым типом носителя в кодировке, которую сервер не может понять (в соответствии с заголовком Content-Encoding для клиента, упакованного с сообщением запроса).

Пожалуйста, попробуйте установить content-type на xml:

getRate = () => {
    var options = {
      hostname: "www.vietcombank.com.vn",
      port: 443,
      path: "/ExchangeRates/ExrateXML.aspx",
      headers: {
        'Content-Type': 'application/xml'
      }
    };

    https.get(options, function(res) {
      ...
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...