Primus与Express

时间:2014-02-23 12:05:16

标签: node.js express primus

我想在Express中使用Primus。 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在get 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在客户端工作,但当然没有人在服务器端回答,因为我已经禁用了。

知道什么是错的吗?

1 个答案:

答案 0 :(得分:2)

我认为问题出现是因为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');
});