Primus with Express

我想用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在获取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。

任何想法有什么不对?

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

我也想在你的HTML文件中,你有这样的东西:

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

尝试将其replace为:

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

然后replace这一行:

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