Передача данных из узла сбора данных в браузер

Я хотел бы передать данные (var xy) из одного файла javascript (A.js) в другой файл javascript (B.js) и визуализировать это с помощью index.html.

A.js: сбор данных с помощью node.js из json.

B.js: создание диаграмм/диаграмм для визуализации на основе данных, собранных с помощью A.js.

index.html: отображение диаграмм/диаграмм из B.js в веб-браузере.

Что уже работает:

  • A.js работает, если я запускаю скрипт с "node A.js" в консоли.
  • B.js/index.html работает, если я начинаю с узла (экспресс) веб-сервера. Графики/диаграммы находятся в браузере.

Но как мне совместить A.js с B.js/index.html? Что-то вроде «module.exports.xy»?

A.js:

var fs = require('collection-json');            //used for read the BELA API information (collection+json)
var underscore = require('underscore');         //used to filter for specific objects (parameters) in the collection
var lookupTable = require('./lookupTable');     //used to have access to the lookup table for the service name of the TM/TC
var _ = require('lodash');                      //is not used yet, but it could be for delivering consistency customization, performance and so on (input from Alain)


var TMTC = "TM";
var dateA = "2013-10-20";
var dateB = "2013-10-22";

var afterDate = "after=" + dateA + "&";
var toDate = "to=" + dateB;
var time = "22:56:26";

console.log("\nAfter date:\t" + dateA);
console.log("To date:\t" + dateB);
console.log("Time:\t\t" + time);

var x_axis_time_stamp_array = new Array();

// Start at the root of our api
var content = fs("http://oberon.unibe.ch/bela-api/v0.0.2/labs/starsim/devices/bela/channels/"+TMTC+"_pus?"+toDate+"T"+time+".000Z", function(error, collection){

    //If no data are available on the server...
    if (error){
        console.log("TM/TC does not exist.");
    }


    //Test---------------------------------------------------------------------------------------
    console.log(collection._collection.items[0]);
    console.log(collection._collection.items[0].data[0]);
    console.log(
            _.contains(collection._collection.items[0], { name: "hash", value: "e2673ab6", promt: "Hash" })
    );

    var array = collection._collection.items[0];
    console.log(array);
    console.log(
            _.contains(array, { name: "hash", value: "e2673ab6", promt: "Hash" } )
    );
    //Test---------------------------------------------------------------------------------------




    var test = ["1", "2", "3"];
    console.log(test);
    console.log(
    _.contains(test, "2")
    );

    //Test---------------------------------------------------------------------------------------


    //Table legend
    console.log("\nTIME STAMP" + "\t\t\t" + "SERVICE" + " \t" + "SERVICE NAME" + "\t\t" + "SID" + "\n");

    //Iteration over each "data-object" in the "item-collection"
    for (var i = 0; i < collection._collection.items.length; i++) {

        //Time Stamp and fill array
        var time_stamp = collection._collection.items[i].data[1].value;
        x_axis_time_stamp_array[i] = time_stamp; 

        //Service: TM (Service type, Service subtype)
        var service_type = collection._collection.items[i].data[2].value.packet_data_field.data_field_header.service_type;
        var service_subtype = collection._collection.items[i].data[2].value.packet_data_field.data_field_header.service_subtype;
        var service = TMTC + "(" + service_type + "," + service_subtype +")";


        //SID from Application Data in Packet Data Field
        var sid = collection._collection.items[i].data[2].value.packet_data_field.application_data.sid;
        if (sid == undefined){
            sid = "";
        }


        //BELA Mode
//      if (collection._collection.items[i].data[2].value.packet_data_field.application_data.params.hk5 !== undefined) {
//          console.log(collection._collection.items[4].data[2].value.packet_data_field.application_data.params.hk5.bela_mode);
//      }


        //Console Output
        console.log(time_stamp + "\t" + service + " \t" + lookupTable.serviceName[service] + "\t\t" + sid);
    }

});



//provides data to B.js
exports.XY = 5;

B.js:

var input = require('./A.js');
alert('input.XY');

var data1 = [ { x: -1893456000, y: 25868573 }, { x: -1577923200, y: 29662053 }, { x: -1262304000, y: 34427091 }, { x: -946771200, y: 35976777 }, { x: -631152000, y: 39477986 }, { x: -315619200, y: 44677819 }, { x: 0, y: 49040703 }, { x: 315532800, y: 49135283 }, { x: 631152000, y: 50809229 }, { x: 946684800, y: 53594378 }, { x: 1262304000, y: 55317240 } ];
var data2 = [ { x: -1893456000, y: 29888542 }, { x: -1577923200, y: 34019792 }, { x: -1262304000, y: 38594100 }, { x: -946771200, y: 40143332 }, { x: -631152000, y: 44460762 }, { x: -315619200, y: 51619139 }, { x: 0, y: 56571663 }, { x: 315532800, y: 58865670 }, { x: 631152000, y: 59668632 }, { x: 946684800, y: 64392776 }, { x: 1262304000, y: 66927001 } ];
var data3 = [ { x: -1893456000, y: 29389330 }, { x: -1577923200, y: 33125803 }, { x: -1262304000, y: 37857633 }, { x: -946771200, y: 41665901 }, { x: -631152000, y: 47197088 }, { x: -315619200, y: 54973113 }, { x: 0, y: 62795367 }, { x: 315532800, y: 75372362 }, { x: 631152000, y: 85445930 }, { x: 946684800, y: 100236820 }, { x: 1262304000, y: 114555744 } ];

var palette = new Rickshaw.Color.Palette();

var graph1 = new Rickshaw.Graph( {
        element: document.querySelector("#chart-type1"),
        width: 580,
        height: 250,
        series: [ {
            name: "Name of Chart3",
            color: palette.color(),
            data: data1
        } ]
} );

var graph2 = new Rickshaw.Graph( {
    element: document.querySelector("#chart-type2"),
    width: 580,
    height: 250,
    series: [ {
        name: "Name of Chart3",
        color: palette.color(),
        data: data2
    } ]
} );

var graph3 = new Rickshaw.Graph( {
    element: document.querySelector("#chart-type3"),
    width: 580,
    height: 250,
    series: [ {
        name: "Name of Chart3",
        color: palette.color(),
        data: data3
    } ]
} );



//Axis Properties

var x_axes = new Rickshaw.Graph.Axis.X( { graph: graph1 } );
var x_axes = new Rickshaw.Graph.Axis.Time( { graph: graph2 } );
var x_axes = new Rickshaw.Graph.Axis.Time( { graph: graph3 } );

var y_axis = new Rickshaw.Graph.Axis.Y( {
    graph: graph1,
    orientation: 'right',
    tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
    element: document.getElementById('y_axis'),
} );
var y_axis = new Rickshaw.Graph.Axis.Y( {
    graph: graph2,
    orientation: 'right',
    tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
    element: document.getElementById('y_axis'),
} );
var y_axis = new Rickshaw.Graph.Axis.Y( {
    graph: graph3,
    orientation: 'right',
    tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
    element: document.getElementById('y_axis'),
} );



//Chart Rendering

graph1.render();
graph2.render();
graph3.render();

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">

    <title>Data_Monitoring</title>


    <!-- Cascading Style Sheets  -->
    <link href="css/custom.css" media="screen" rel="stylesheet" type="text/css" >
    <link href="css/rickshaw.css" media="screen" rel="stylesheet" type="text/css" >
    <link href="css/envision.css" media="screen" rel="stylesheet" type="text/css" >


</head>
<body>

    <h1>Title</h1>


    <!-- Drawing charts -->
    <div id="chart-type1"></div>
    <div id="chart-type2"></div>
    <div id="chart-type3"></div>


    <!-- JavaScript  -->
    <script type="text/javascript" src="lib/d3.min.js"></script>
    <script type="text/javascript" src="lib/rickshaw.js"></script>

    <script type="text/javascript" src="js/A.js"></script>
    <script type="text/javascript" src="js/lookupTable.js"></script>

    <script type="text/javascript" src="js/B.js"></script>


</body>
</html>

person Kevin    schedule 06.06.2014    source источник


Ответы (1)


Да, по сути, вам нужно будет экспортировать объект или функцию, которая возвращает данные из A.js, и использовать их в B.js. Вот простой пример использования modules из Node API:

Содержимое circle.js:

var PI = Math.PI;

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

Содержимое foo.js:

var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is '
       + circle.area(4));

Если вам нужна дополнительная помощь в понимании того, как это использовать, отправьте примеры кода, чтобы мы могли помочь.

Обновлять

Вот пример кода, который поможет вам начать работу с Express и Магистраль. Это не претендует на полноту, но, надеюсь, даст вам представление о том, как начать использовать две технологии для отправки информации с сервера (узла) клиенту (браузеру).

Файл конечной точки Express API (запускается из Node.js):

// This creates a HTTP GET endpoint for your Express app
// which will return the data when a user hits /my-endpoint
app.get("/my-endpoint", function(req, res) {
    // populate the data to return to the client
    var data = {
        XY: 5
    };

    // send the data
    res.send(data);
});

Код на стороне клиента Backbone (запускается из браузера):

// This creates a Backbone Model which will hit
// the API endpoint /my-endpoint
var DataModel = Backbone.Model.extend({
    url: "/my-endpoint"
});

// Create a new instance of the DataModel
var dataModel = new DataModel();

// A function to display the data contained within the dataModel
function displayData() {
    // write the data model to the browser's console
    console.log("dataModel: " + dataModel.toJSON());
}

// when the data model API call is complete, call the displayData function
dataModel.on("sync", displayData);

// fetch() == GET HTTP request to the URL specified in the model
// This will perform the HTTP request to the Express endpoint, and
// once complete, contain the data returned from the API.
// 
// Because we linked this to displayData, that function will be called
// once the fetch is complete.
dataModel.fetch();
person dylants    schedule 06.06.2014
comment
Привет, спасибо за ваш ответ и извините за мой поздний ответ. Как вы можете видеть выше, я включил код. A.js экспортирует переменную XY в конце кода, а B.js импортирует в начале скрипта. Когда я запускаю B.js с index.html, выполнение кода останавливается на var input = require(./B.js);... Все после этой строки выполняться не будет. Если я включу эту строку в конец B.js, все, что было до нее, будет выполнено. - person Kevin; 11.06.2014
comment
Как вывод: все работает кроме импорта вар XY. Я пытался предупредить об этом в браузере, но это не сработало. :-( - person Kevin; 11.06.2014
comment
Исправление к моему первому комментарию: var input = require(./A.js);... вместо B.js - person Kevin; 11.06.2014
comment
Итак, исходя из того, что я вижу, вам нужно только запустить узел с B.js, так как он будет импортировать A.js (оба должны находиться в одном каталоге). Чтобы запустить B.js, вам нужно запустить node B.js. Я немного запутался в том, как index.html включен в этот микс. Node должен запускать эти файлы, а не браузер (поэтому не alert, а console.log). - person dylants; 11.06.2014
comment
Меня именно это тоже смущает. Цель состоит в том, чтобы показать данные, собранные узлом из файла json, в диаграммах, соответственно. браузер. A.js работает, когда я запускаю его в cmd с узлом A.js. С другой стороны, браузер показывает мне диаграммы, созданные в B.js. Но я хотел бы показать графики на основе данных из A.js. Если это поможет: я также интегрировал код index.html... Я рад, что вы пытаетесь мне помочь, спасибо! - person Kevin; 11.06.2014
comment
Хорошо, я понял. Что вы хотите сделать, так это отправить данные со стороны сервера (узла) на сторону клиента (браузер). Для этого вам придется немного поработать. В большинстве случаев это обрабатывается через некоторый API на стороне сервера, который отправляет данные по HTTP на сторону клиента. Клиент делает HTTP-запрос к конечной точке API, получает данные и использует их для заполнения некоторого шаблона. Существуют фреймворки для обработки обеих сторон, или вы можете написать их вручную. Но что вы не можете сделать, так это просто включить файл javascript на стороне клиента и сделать его require скриптом узла. - person dylants; 11.06.2014
comment
В точку! Хм хорошо. Я только что проверил интернет и нашел фреймворк под названием Backbone.js. Я прочитаю/узнаю это, чтобы увидеть, полезно ли это для моей проблемы. Было бы здорово, если бы у вас были дополнительные подсказки и по этому вопросу. В любом случае, спасибо за вашу поддержку! - person Kevin; 12.06.2014
comment
Да, магистраль — это широко используемый клиентский фреймворк. На самом деле все, что вам нужно, это использовать его модель, чтобы сделать запрос API, который вы затем проверите, чтобы заполнить свой Посмотреть. На стороне сервера я бы посмотрел на express, поскольку он также широко используется. Я добавлю некоторый общий код к ответу выше, чтобы дать вам представление. - person dylants; 12.06.2014