首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有其他websocket事件的ShareDB

带有其他websocket事件的ShareDB
EN

Stack Overflow用户
提问于 2018-03-02 04:59:59
回答 1查看 900关注 0票数 2

我正在尝试将Node.js WebSockets与sharedb一起使用。这是我到目前为止所掌握的

代码语言:javascript
复制
var http = require('http');
var express = require('express');
var ShareDB = require('sharedb');
var WebSocket = require('ws');
var WebSocketJSONStream = require('websocket-json-stream');
var ShareDBLogger = require('sharedb-logger');

var backend = new ShareDB();
createDoc(startServer);

// Create initial document then fire callback
function createDoc(callback) {
  var connection = backend.connect();
  const sharedbLogger = new ShareDBLogger(backend);
  var doc = connection.get('examples', 'text');

  doc.fetch(function(err) {
    if (err) throw err;
    if (doc.type === null) {
      doc.create({content: 'Hello'}, 'text', callback);
      return;
    }
    callback();
  });
}

function startServer() {
  // Create a web server to serve files and listen to WebSocket connections
  var app = express();
  var server = http.createServer(app);

  // Connect any incoming WebSocket connection to ShareDB
  var wss = new WebSocket.Server({server: server});
  wss.on('connection', function(ws, req) {
    var stream = new WebSocketJSONStream(ws);
    backend.listen(stream);

    ws.on('message', function (data) {
      const json = JSON.parse(data);
      if(json.type === 'request-id') ws.send('some-id');
    })
  });

  server.listen(8080);
  console.log('Listening on http://localhost:8080');
}

但是,由于我的客户端发送的WebSocket消息{type: 'request-id'}不是sharedb的标准操作之一,所以我总是收到这个错误消息:

代码语言:javascript
复制
Error: { type: 'request-id',
  error: { code: 4000, message: 'Invalid or unknown message' } }

如何告诉sharedb在侦听websocket流时忽略某些非操作的websocket消息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-22 23:29:47

WebSocketJSONStream假设每个经过的websocket事件都是一个sharedb事件。这是一个库:https://github.com/avital/websocket-json-stream/blob/master/index.js

代码语言:javascript
复制
var util = require('util');
var Duplex = require('stream').Duplex;

function WebSocketJSONStream(ws) {
  // Make work with or without 'new'
  if (!(this instanceof WebSocketJSONStream)) return new WebSocketJSONStream(ws);
  Duplex.call(this, {objectMode: true});
  this.ws = ws;
  var self = this;

  ws.on('message', function(msg) {
    // You need to catch your own personal websocket events here that are NOT being used by sharedb - perhaps filter by its title/message?
    self.push(JSON.parse(msg)); 
  });
  ws.on('close', function() {
    self.push(null); // end readable stream
    self.end(); // end writable stream

    self.emit('close');
    self.emit('end');
  });

  this.on('error', function() { ws.close(); });
  this.on('end', function() { ws.close(); });
};
util.inherits(WebSocketJSONStream, Duplex);

WebSocketJSONStream.prototype._read = function() {};
WebSocketJSONStream.prototype._write = function(msg, encoding, next) {
  this.ws.send(JSON.stringify(msg));
  next();
};

module.exports = WebSocketJSONStream;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49058595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档