Поток событий в узле: отлично работает в консоли, но не записывает в поток - PullRequest
0 голосов
/ 13 января 2019

Я хочу транслировать события в localhost / czml, который прекрасно работает в консоли или в окне запроса на получение. Но я не могу передать эти переменные на страницу, потому что req.query всегда оказывается неопределенным

Я кровавый новичок в программировании, и большую часть времени я понятия не имею, что я делаю (вот почему код такой плохой ...). Я получил этот код методом проб и ошибок и в основном путем копирования откуда-то

var express = require('express'),
    fs = require('fs'),
    morgan = require('morgan'),
    path = require('path'),
    os = require('os'),
    http = require('http');

    const app = express();
    const EventEmitter = require('events');
    const stream = new EventEmitter();
    var czmlstream = fs.createWriteStream('czml.czml',{flags: 'a'});


    app.get('/czml', function (req, res, next) {
    //don't log favicon
    if (req.url === '/favicon.ico'){
        res.end();
        return;
    }

    //only log GET and set to stream
    if (req.method === 'GET' ) {
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
    });

    function createCzml() {
        //get the query value from the request
        var id = req.query.id;
        var lon = parseInt(req.query.lon);
        var lat = parseInt(req.query.lat);
        var alt = parseInt(req.query.alt);

        // custom json format for czml file
        var entity = {
            "id": id,
            "position": {
                "cartographicDegrees": [lat, lon, alt]
            },
            "point": {
                "color" : {"rgba": [0,0,255,255]},
            "pixelSize": 20
            }
        };
        return entity;

    }   
        //first 2 lines for the event stream
    res.write('event: czml\n');
    res.write('data:' + JSON.stringify({ "id":"document", "version":"1.0" })+   
    '\n\n');

    //always tells me that 10 listeners are added .... ?
    stream.setMaxListeners(0);

    //stream.on(req) = emit event on get request?
    stream.on('req', function() {
        res.write('event: czml\n');
        res.write('data:' +JSON.stringify(createCzml)+ '\n\n'); //this 
    doesn't work
    });
    //not sure why this is needed
    stream.emit('req');
    }else{
        res.WriteHead(405, {'Content-Type': 'text/plain'});
        res.end('No GET Request - not allowed');
    }

    //morgan(format, {stream: czmlstream})(req,res,next);   
    }).listen(8000);
    console.log('Server running');

Чего я хочу достичь: кто-то отправляет запрос get на localhost / czml /? id = 1 & lon = -40 & lat = 30 & alt = 5000 => эти запросы анализируются и отправляются на localhost / что угодно как поток событий в формате:

событие: czml данные: {json}

Я почти на месте (даже если код плохой) - это только последняя часть, где я должен написать эти надоедливые запросы в localhost / что угодно. Прямо сейчас он регистрирует все нормально в консоли, но undefined записывается в localhost / what ... ... 1010 *

Буду очень признателен, если вы укажете мне правильное направление - имейте в виду, что мне нужны простые и хорошие объяснения;)

1 Ответ

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

хорошо, я решил это самостоятельно и просто для справки для некоторых других новичков:

Это в основном это Пример, только со слушателями (как я их понял) для запросов на получение

    // most basic dependencies
var express = require('express')
  , http = require('http')
  , os = require('os')
  , path = require('path')
  , url = require('url')
  , fs = require('fs');

// create the app
var app = express();

// configure everything, just basic setup
//app.set('port', process.env.PORT || 8000);
app.use(function(req, resp, next) {
  resp.header("Access-Control-Allow-Origin", "*");
  resp.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

// Serve the www directory statically
app.use(express.static('www'));

//---------------------------------------
// Handle Get request and event-stream every second
//---------------------------------------
var openConnections = [];

var id, lon, lat, alt;

app.get('/czml', function(req, res, next) {
    //don't log favicon
    if (req.url === '/favicon.ico'){
        res.end();
        return;
    } else {

    var queryData = url.parse(req.url, true).query;
    id = queryData.id;
    lon = queryData.lon;
    lat = queryData.lat;
    alt = queryData.alt;

    req.socket.setTimeout(2 * 60 * 1000);

    // send headers for event-stream connection
    // see spec for more information
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
    });
    res.write('\n');

    // push this res object to our global variable
    openConnections.push(res);

    // send document packet
    res.write('event: czml\ndata:' + JSON.stringify({ "id":"document", "version":"1.0" })+   '\n\n');

    // When the request is closed, e.g. the browser window
    // is closed. We search through the open connections
    // array and remove this connection.
    req.on("close", function() {
        var toRemove;
        for (var j =0 ; j < openConnections.length ; j++) {
            if (openConnections[j] == res) {
                toRemove =j;
                break;
            }
        }
        openConnections.splice(j,1);
    });
    next();
    }
}).listen(8000);

function createMsg() {
        var entity = {
            "id" : id,
            "position" : {
                "cartographicDegrees": [lon,lat,alt]
            },
            "point" : { 
                "color" : {
                    "rgba" : [0,0,255,255]
                },
                "pixelSize" : 15
            }

        };
        return JSON.stringify(entity);;
    }

setInterval(function() {
    // we walk through each connection
    openConnections.forEach(function(res) {
        // send doc
        res.write('event: czml\n');
        res.write('data:' + createMsg() +   '\n\n');
    });
}, 1000);

Я не знаю, как это работает здесь, на SO - вышеизложенное не является ответом на мой вопрос - это скорее обходной путь. Но это работает, так что я думаю, что все в порядке:)

...