【问题标题】:now.js not readynow.js 没有准备好
【发布时间】:2012-08-22 17:22:52
【问题描述】:

我有一点问题。我正在尝试使用 node.js/express.js/now.js 创建一个动态 Web 应用程序。我已经完成了http://nowjs.com/download 的小示例代码中所示的所有操作,但没有成功,客户端 now.js 脚本正确托管,但 now.ready(..) 永远不会触发。唯一的区别是我使用 express 而我用于初始化 now.js 的服务器是 https。

你有什么想法会导致它不起作用吗?

服务器端:

var server = express.createServer(..);
..
server.listen(port, function() {..});
var nowjs = require('now');
var everyone = nowjs.initialize(server);
everyone.now.log = function(msg) { console.log(msg); }

客户端:

<script type="text/javascript" src="/nowjs/now.js"></script>
<script type="text/javascript">
    now.ready(function() { now.log('asd'); alert('asd'); });
</script>

任何帮助将不胜感激!

最好的,科内尔

【问题讨论】:

    标签: node.js express nowjs-sockets


    【解决方案1】:

    嗯,找到了答案。 长答案:now.js 在确定 socket.io 应该通信的通信端口时存在问题。此问题似乎仅在使用默认 https 端口 (443) 时出现。

    我找到了两个解决方案,一个丑陋的: https://groups.google.com/forum/?fromgroups=#!topic/nowjs/8cO9D77tN2o

    基本上你需要在 now/lib/fileServer.js 编辑 now.js 的源代码并替换

    var hostPort =  options['port'] || host[1] || '80';
    

    var hostPort =  options['port'] || host[1] || ((request.headers.referer.split(':')[0] === 'https') ? '443' : '80');
    

    更好的方法是将端口选项设置为 socket.io。幸运的是,now.js 支持这一点:

    var everyone = nowjs.initialize(server, {port: port, socketio: {transports: ['xhr-polling', 'jsonp-polling']}});
    

    我希望这将帮助其他遇到相同问题的人,也希望稍后在 now.js 中修复此行为。

    最好的问候:Kornel

    【讨论】:

      【解决方案2】:

      运行最新版本的节点,现在在 OSX 上使用 Safari。

      server.js

      var html = require('fs').readFileSync(__dirname+'/index.html');
      var httpServer = require('http').createServer(function(req, response) { 
          /* Serve your static files */ 
          response.end(html);
      })
      httpServer.listen(8080);
      
      var nowjs = require("now");
      var everyone = nowjs.initialize(httpServer);
      
      console.log('done');
      everyone.now.logStuff = function(msg){
          console.log(msg);
      }
      

      index.html

      <script type="text/javascript" src="http://localhost:8080/nowjs/now.js"></script>
      
      <script type="text/javascript">
        now.ready(function(){
          // "Hello World!" will print on server
          now.logStuff("Hello World!");
        });
      </script>
      done..
      

      启动服务器:

      node server.js
      

      打开浏览器:

      http://localhost:8080
      

      【讨论】:

      • 这两个代表不同的语义。 $(document).ready(..) 表示 html dom 已经加载。 now.ready(..) 表示已经与服务器建立了 socket.io 连接。我已经很努力了,仍然无法使用 express.js 和 htmls... :((
      • 此示例按预期工作,但它不使用 express 并且不是 https 服务器。
      • "NowJS 0.7 支持在初始化时传入 HTTPS 服务器。无需额外配置。" blog.nowjs.com
      • 好吧,用 https 或 express 试试我的例子。所以你可以隔离问题。我没有 https 设置。
      • 对于自签名证书我可以想象它可能会带来问题。但是那个快递不行。能贴出完整代码吗?
      猜你喜欢
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 2019-11-19
      相关资源
      最近更新 更多