2015-12-18 1 views
0

Я пытаюсь получить plotly для потоковой передачи данных, полученных моим сервером, с помощью запроса POST на адрес http://localhost:3000/step.Не удается получить plotly + node.js для потоковой передачи данных, поступающих через запросы POST

Строительство на rest-example.js в plotly-nodejs/примеры, вот мой код сервера (я размыто мое имя пользователя, apikey и жетон):

'use strict'; 

var express = require('express'); 
var logger = require('morgan'); 
var bodyParser = require('body-parser'); 
var events = require('events'); 
var eventEmitter = new events.EventEmitter(); 

var app = express(); 
var server = require('http').Server(app); 
var port = process.env.PORT || 3000; 
server.listen(port); 

app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

app.post('/step', function(req, res) { 
    var data = req.body.data; 
    eventEmitter.emit('step', data); 
    res.end('ok'); 
}); 

var plotly = require('plotly')('username', 'apikey'); 
var token = 'token'; 

var dataInit = [{x:[], y:[], stream: { token: token, maxpoints: 10 } }]; 
var layout = {fileopt : "extend", filename : "REST-test"}; 

plotly.plot(dataInit, layout, function (err, msg) { 
    if(err) return console.error('step data error', err.stack); 

    var stream = plotly.stream(token, function() {}); 

    eventEmitter.on('step', function(data) { 
     console.log('sending to plotly: ' + data + ' steps'); 

     var streamObject = JSON.stringify({ x: getDateString(), y: data }); 
     stream.write(streamObject+'\n'); 
    }); 
}); 

function getDateString() { 
    var d = new Date(); 
    return d.toLocaleString(); 
}; 

Когда я POST данных с помощью Curl, например curl http://localhost:3000/step --data "data=5", я вижу, что данные доходят до обратного вызова внутри блока plotly.plot, но сюжетно никогда не запускается и не передает данные.

В некотором немного более сложном коде сервера, над которым я работал раньше, я также получаю сообщение об ошибке, которое может быть или не быть связано и которое всегда указывает на начало блока plotly.plot.

cb(null, body); 
     ^
SyntaxError: Unexpected end of input 

Это полный стек ошибок:

/home/plotly-testing/node_modules/plotly/index.js:305 
     cb(null, body); 
     ^
SyntaxError: Unexpected end of input 
    at Object.parse (native) 
    at /home/plotly-testing/node_modules/plotly/index.js:72:25 
    at IncomingMessage.<anonymous> (/home/plotly-testing/node_modules/plotly/index.js:305:9) 
    at IncomingMessage.emit (events.js:129:20) 
    at _stream_readable.js:908:16 
    at process._tickCallback (node.js:355:11) 
--------------------------------------------- 
    at IncomingMessage.Readable.on (_stream_readable.js:671:33) 
    at parseRes (/home/plotly-testing/node_modules/plotly/index.js:304:9) 
    at ClientRequest.<anonymous> (/home/plotly-testing/node_modules/plotly/index.js:71:9) 
    at ClientRequest.emit (events.js:107:17) 
    at HTTPParser.parserOnIncomingClient (_http_client.js:426:21) 
    at HTTPParser.parserOnHeadersComplete (_http_common.js:111:23) 
    at TLSSocket.socketOnData (_http_client.js:317:20) 
--------------------------------------------- 
    at new ClientRequest (_http_client.js:93:10) 
    at Object.exports.request (http.js:49:10) 
    at Object.exports.request (https.js:136:15) 
    at Plotly.plot (/home/plotly-testing/node_modules/plotly/index.js:70:21) 
    at Object.<anonymous> (/home/plotly-testing/index.js:175:8) 
    at Module._compile (module.js:460:26) 
    at Object.Module._extensions..js (module.js:478:10) 
    at Module.load (module.js:355:32) 
    at Function.Module._load (module.js:310:12) 

линия 305 plotly/index.js указывает следующий метод, который, кажется, указывают на то, что был неправ в одном из моих обратных вызовов, но я не уверен, ,

// response parse helper fn 
function parseRes (res, cb) { 
    var body = ''; 
    if ('setEncoding' in res) res.setEncoding('utf-8'); 

    res.on('data', function (data) { 
     body += data; 
     if (body.length > 1e10) { 
      // FLOOD ATTACK OR FAULTY CLIENT, NUKE REQ 
      res.connection.destroy(); 
      res.writeHead(413, {'Content-Type': 'text/plain'}); 
      res.end('req body too large'); 
      return cb(new Error('body overflow')); 
     } 
    }); 

    res.on('end', function() { 
     cb(null, body); 
    }); 

} 
+0

Ключ 'SyntaxError: Неожиданный конец ввода в Object.parse (родной)'. Я не думаю, что это проблема с вашим обратным вызовом - один из вызовов 'JSON.parse' [здесь] (https://github.com/plotly/plotly-nodejs/blob/master/index.js#L170) скорее всего, не выполняется, а проверка ошибки недостаточна. –

ответ

2

Так что я изменил код, чтобы включать console.log внутри Plotly.plot обратного вызова.

См суть здесь: https://gist.github.com/alexander-daniel/b36f9be78abbbaa4847e#file-index-js-L33

И таким образом мы можем видеть, что Plotly вернулся граф URL, который мы можем смотреть. https://gist.github.com/alexander-daniel/b36f9be78abbbaa4847e#file-console_output-L5

Это должно решить первую проблему.

Что касается второго вопрос идет, кажется, проблема заключается в два раза: - JSON.parse звонков внутри библиотеки не завернутые в Try/поймать, так это выглядит, как если поток-сервер возвращает все, что не JSON , это сломается.

Мы изучаем возврат ошибок потокового сервера, но я открыл эту проблему здесь re: блоки try/catch в библиотеке API.

github.com/plotly/plotly-nodejs/issues/37

Смежные вопросы