【问题标题】:Primus with ExpressPrimus 与 Express
【发布时间】:2014-02-23 23:09:20
【问题描述】:

我想将Primus 与 Express 一起使用。 Primus 作为 websockets 的抽象层。我使用 Primus 示例效果很好 - 我使用了基本的 Express 示例 - 效果很好。但不知何故,我可以让他们一起工作。

index.html(只是标准的 primus 示例 html)和 primus.js 位于文件夹 ./public

这就是我正在做的事情。

var express = require('express');
var Primus = require('primus');
var http = require('http');
var path = require('path');
var app = express();

var server = require('http').createServer(app)
, primus = new Primus(server, { transformer: 'engine.io' });


app.set('port', process.env.PORT || 3000);
app.use(express.logger('dev'));
app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies
app.use(express.methodOverride());

app.use(app.router);
app.use(express.static(__dirname + '/public'));


// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

primus.on('connection', function connection(spark) {
    console.log('new connection');
    spark.write({ Welcome: 'Hello!' });
});

primus.save(__dirname +'/public/primus.js');

/* the normal express start
http.createServer(app).listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});
*/

server.listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});

访问时的输出

http://localhost:3000/index.html


Express server listening on port 3000
GET /index.html 200 73ms - 5.22kb

index.html 服务正确。但没有出现对 primus.js 的请求。 index.html 在获取 primus.js 时显示 400 错误

当我禁用上面代码中的 primus 部分并使用正常的快速启动时,我得到以下输出:

Express server listening on port 3000
GET /index.html 200 79ms - 5.22kb
GET /primus.js 200 69ms - 96.54kb

所以所有服务都正确。 Prmius 在客户端上工作,但服务器端当然没有人回答,因为我禁用了 primus。

知道有什么问题吗?

【问题讨论】:

    标签: node.js express primus


    【解决方案1】:

    我认为问题出现是因为 Primus 拦截了所有以/primus 开头的请求,因此 Express 无法提供 primus.js 文件。

    我还假设在您的 HTML 文件中有类似的内容:

    <script src="/primus.js"></script>
    

    尝试将其替换为:

    <script src="/public/primus.js"></script>
    

    然后替换这一行:

    app.use(express.static(__dirname + '/public'));
    

    用这个:

    app.use('/public', express.static(__dirname + '/public'));
    

    更新

    由于我们更改了静态文件 URI,我们必须手动提供 index.html

    app.get('/', function(req, res) {
      res.sendfile(__dirname + '/public/index.html');
    });
    

    【讨论】:

    • 是的,“primus.js”从未被下载是“/primus”命名空间问题。我注意到我还可以通过配置中的pathname 选项更改命名空间(感谢 Arnout Kazemier 的指出)。现在也可以了。
    猜你喜欢
    • 2019-10-06
    • 2017-10-03
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    相关资源
    最近更新 更多