node-websocket-server TypeError: Аргумент должен быть строкой - PullRequest
1 голос
/ 23 апреля 2011

Я отслеживаю / var / log / logfile в Ubuntu и получаю TypeError. Работает на моей локальной машине Mac /var/log/system.log.

Команда:

sudo node server.js /var/log/logfile (must be sudo to view this log file)

Ошибка:

/npm/node_modules/node-websocket-server/lib/ws/connection.js:290
    var byteLen = Buffer.byteLength(data, 'utf8'),
                         ^
TypeError: Argument must be a string
    at Connection.<anonymous> (/npm/node_modules/node-websocket-server/lib/ws/connection.js:290:26)
    at clientWrite (//npm/node_modules/node-websocket-server/lib/ws/server.js:34:12)
    at /npm/node_modules/node-websocket-server/lib/ws/server.js:99:7
    at Manager.forEach (/npm/node_modules/node-websocket-server/lib/ws/manager.js:125:14)
    at Server.broadcast (npm/node_modules/node-websocket-server/lib/ws/server.js:98:13)
    at Socket.<anonymous> (/npm/server.js:63:11)
    at Socket.emit (events.js:64:17)
    at Socket._onReadable (net.js:677:14)
    at IOWatcher.onReadable [as callback] (net.js:177:10)

Код:

/*
 * server.js
 */

var util   = require('util');
var sys = require("sys");
var ws = require("/npm/node_modules/node-websocket-server");
var spawn = require('child_process').spawn;

var filename = process.ARGV[2];

if (!filename)
  return sys.puts("Usage: node <server.js> <filename>");

var server = ws.createServer({debug: true});

/*
 * After server comes up
 */
server.addListener("listening", function() {
    sys.log("Listening for connections on localhost:9997");
});

/*
 * Define any port
 */
server.listen(9997);

var tail = spawn("tail", ["-f", filename]);
sys.puts("start tailing");

tail.stdout.on("data", function (data) {
    /* 
     * Send data
     */
    server.broadcast(data);
    console.log('' + data);
});

1 Ответ

3 голосов
/ 23 апреля 2011

В настоящее время узел-веб-сокет-сервер принимает данные только в виде строк, а не буферов. Буферы могут быть приняты в будущем, это в значительной степени связано с ограничением кадров и тем, что я не хочу делать большое количество буферного копирования. (Кажется безответственно выписывать в сокет только 0xFF или 0x00).

Также попробуйте сделать:

var tail = spawn('tail', ['-f', filename]);

tail.stdout.setEncoding('utf8')

Поскольку потоки stdout и stderr по умолчанию не используют кодировку, это означает, что событие data испускает объекты Buffer. Относительно того, почему это работает на вашем Mac, но не работает в Ubuntu, я не уверен, но, выполняя быстрый тест только минуту назад, у меня есть и Ubuntu, и Mac, дающие мне объекты буфера, если я специально не установил кодировку потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...