如何在Node.js中定义Watershed?

时间:2016-11-03 08:59:03

标签: javascript node.js express restify

当我执行以下代码时,我收到错误:引用错误:未定义分水岭。我该如何定义它?我是否需要为其安装模块?

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);
});

2 个答案:

答案 0 :(得分:1)

还有一部分restify文档提到了如何处理升级套接字的能力。我只是花了很长时间才挣扎于此,并且认为我会分享这个简单的解决方案。除了@Dibu Raj回复之外,您还需要创建您的restify服务器,并将handleUpgrades选项设置为true。以下是使用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);
});

对于测试新nodejs websocket服务器的html页面:将下面的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

答案 1 :(得分:0)

您应该包含分水岭图书馆

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