【问题标题】:How do I define Watershed in Node.js?如何在 Node.js 中定义分水岭?
【发布时间】:2017-05-15 19:24:13
【问题描述】:

当我执行以下代码时,我收到错误:参考错误:未定义分水岭。我该如何定义它?我需要为它安装一个模块吗?

var restify=require('restify');
var ws= new Watershed();
var server=restify.createServer();
server.get('websocket/attach', function upgradeRoute(req, res, next){
    if(!res.claimUpgrade){
        next(new Error("Connection must be upgraded."));
        return;
    }
    var upgrade=res.claimUpgrade();
    var shed=ws.accept(req, upgrade.socket, upgrade.head);
    shed.on('text', function (msg){
        console.log("The message is: "+msg);
    });
    shed.send("hello there");
    next(false);
});
server.listen(8081, function(){
    console.log('%s listening at %s', server.name, server.url);
});

【问题讨论】:

    标签: javascript node.js express restify


    【解决方案1】:

    restify 文档中还有一部分提到了如何处理升级套接字的能力。我只是为此苦苦挣扎了很长时间,并认为我会分享简单的解决方案。除了@Dibu Raj 回复之外,您还需要创建您的restify 服务器,并将handleUpgrades 选项设置为true。这是一个完整的例子,可以让 restify 与 websocket 升级和分水岭一起工作:

    'use strict';
    var restify = require('restify');
    var watershed = require('watershed');
    var ws = new watershed.Watershed();
    
    var server = restify.createServer({
      handleUpgrades: true
    });
    
    server.get('/websocket/attach', function (req, res, next) {
      if (!res.claimUpgrade) {
        next(new Error('Connection Must Upgrade For WebSockets'));
        return;
      }
      console.log("upgrade claimed");
    
      var upgrade = res.claimUpgrade();
      var shed = ws.accept(req, upgrade.socket, upgrade.head);
    
      shed.on('text', function(msg) {
        console.log('Received message from websocket client: ' + msg);
      });
    
      shed.send('hello there!');
    
      next(false);
    });
    
    //For a complete sample, here is an ability to serve up a subfolder:
    server.get(/\/test\/?.*/, restify.serveStatic({
      directory: './static',
      default: 'index.html'
    }));
    
    server.listen(8080, function() {
      console.log('%s listening at %s', server.name, server.url);
    });
    

    对于一个 html 页面来测试你的新 nodejs websocket 服务器:将下面的 html 写入 ./static/test/index.html 的文件中 - 将浏览器指向 http://localhost:8080/test/index.html - 打开浏览器调试控制台以查看消息交换。

    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>Web Socket test area</title>
      <meta name="description" content="Web Socket tester">
      <meta name="author" content="Tim">
    </head>
    <body>
        Test Text.
    <script>
      (function() {
        console.log("Opening connection");
        var exampleSocket = new WebSocket("ws:/localhost:8080/websocket/attach");
        exampleSocket.onopen = function (event) {
          console.log("Opened socket!");
          exampleSocket.send("Here's some text that the server is urgently awaiting!"); 
        };
        exampleSocket.onmessage = function (event) {
          console.log("return:", event.data);
          exampleSocket.close();
        }
      })();
    </script>
    </body>
    </html>
    

    您的浏览器日志将如下所示:

    07:05:05.357 index.html:18 Opening connection
    07:05:05.480 index.html:22 Opened socket!
    07:05:05.481 index.html:26 return: hello there!
    

    您的节点日志将如下所示:

    restify listening at http://[::]:8080
    client connected!
    Rest service called started
    upgrade claimed
    Received message from websocket client: Here's some text that the server is urgently awaiting!
    

    相关文档位于: http://restify.com/#upgrade-requests

    【讨论】:

      【解决方案2】:

      你应该包含分水岭库

      var Watershed = require('lib/watershed').Watershed;
      

      【讨论】:

        猜你喜欢
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-15
        • 1970-01-01
        • 2011-09-08
        • 2013-10-16
        相关资源
        最近更新 更多