Записать JSON в базу данных mysql с помощью node.js - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь записать объект JSON (или строку, неуверенный) в мою базу данных mysql, используя node.js.Сначала я получил JSON через xml-URL, используя xml2js.Я могу записать результат json-строки в мою консоль через JSON.stringify, но я не уверен, что делать дальше.

Вот URL, из которого я взял xml: https://water.weather.gov/ahps2/hydrograph_to_xml.php?gage=deld1&output=xml

Я хотел бы записать каждый экземпляр из строки JSON в строку со столбцами в качестве имени данных.Это выглядело бы примерно так:

enter image description here

Вот мой код в index.js, который я прописал с помощью узла index.js на консоли:

var parseString = require('xml2js').parseString;
var http = require('http');
var https = require('https');
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
  database: "mydb"
});




function xmlToJson(url, callback) {
  var req = https.get(url, function(res) {
    var xml = '';

    res.on('data', function(chunk) {
      xml += chunk;
    });

    res.on('error', function(e) {
      callback(e, null);
    }); 

    res.on('timeout', function(e) {
      callback(e, null);
    }); 

    res.on('end', function() {
      parseString(xml, function(err, result) {
        callback(null, result);
      });
    });
  });
}

var url = "https://water.weather.gov/ahps2/hydrograph_to_xml.php?gage=deld1&output=xml"

xmlToJson(url, function(err, data) {
  if (err) {
    return console.err(err);
  }

  strungout = JSON.stringify(data, null, 1);
  console.log(strungout);
  //strungout contains my json string

})

  con.connect(function(err) {
  if (err) throw err;
  //below is where I might make an insert statement to insert my values into a mysql table
  var sql = someinsertstatement
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("records inserted");
     res.end();
  });
});

Как уже упоминалось, когда я запускаю приведенный выше код в моей консоли, консоль возвращает JSON, хотя я не уверен, как присвоить это переменной, которую я могу затем записать в мою базу данных mysql.

В качестве альтернативы, если есть более простой способ написать XML с веб-сайта непосредственно в мою базу данных MySQL, я, безусловно, был бы признателен за любые указатели.Я чувствую, что это должно быть проще, чем это, но я новичок почти во всем этом.

РЕДАКТИРОВАТЬ: Добавление JSON.Я удалил разрывы строк, чтобы закрепить его.Попытка присвоить результат '4.68' переменной.

data = {"site": {"observed": [{"datum": [{"valid": [{"_": "2019-02-21T19:42:00-00:00","$": {"timezone": "UTC"}}],"primary": [{"_": "4.68","$": {"name": "Stage","units": "ft"}}]}]}]}};

Спасибо.

Ответы [ 2 ]

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

Это сработало на моем конце.Найдено, что основные данные, которые вы ищете: site.observed.datum

const parser = require('xml2json');
const request = require("request");
var mysql = require('mysql');

var con = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "password",
    database: "mydb"
  });

var api_url = 'https://water.weather.gov/ahps2/hydrograph_to_xml.php?gage=deld1&output=xml';

function xmlToJson(url, callback){
    return request({
        method: 'GET',
        url: api_url,
    }, function (error, response, body) {
        if (error) {
           return callback({
               errorResponse: error,
               rowsToInsert: false
            });
        }else{
            let jsonRes = JSON.parse(parser.toJson(body));
            let datumResult = jsonRes.site.observed.datum;//I had to log Object.keys multple time to get the 
            const readyForDB = datumResult.map(x => {
                let timeOfReading = x.valid.$t;
                let stage = x.primary.$t;
                let flow = x.secondary.$t;
                return [
                    timeOfReading, stage, flow
                ]
            });
            return callback({
                errorResponse: false,
                rowsToInsert: readyForDB
            });
        }
    })
}
return xmlToJson(api_url, ({errorResponse, rowsToInsert}) => {
    if(errorResponse){
       throw callback.errorResponse;
    }
    return con.connect(function(err) {
        if (err) throw err;
        //below is where I might make an insert statement to insert my values into a mysql table
        var sql = "INSERT INTO forecast (timeOfReading, stage, flow) VALUES ?"
        con.query(sql, [rowsToInsert], function (err, result) {
        if (err) throw err;
            console.log(result.affectedRows + " rows inserted");
        });
    });
});
0 голосов
/ 21 февраля 2019

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

Допустим, у вас есть этот объект JSON с именем "test":

    {
        a:1
        b:{
            x:2
        }
    }

Вы можете получить значение 1, вызвав test.a, и аналогичнополучить доступ к значению 2, вызвав test.bx

...