Примус с экспрессом

Я хочу использовать Primus с Express . Primus как уровень абстракции для веб-сокетов. Я использовал примеры Primus, работает нормально - я использовал базовые примеры Express - работает нормально. Но каким-то образом я могу заставить их работать вместе.

index.html (просто стандартный пример html primus) и 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 показывает ошибку 400 при получении primus.js

Когда я отключаю часть primus в приведенном выше коде и использую обычный экспресс-запуск, я получаю следующий вывод:

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

Так что все обслужено правильно. Prmius работает на клиенте, но, конечно, на стороне сервера никто не отвечает, так как я отключил primus.

Есть идеи, что случилось?


person Lars    schedule 23.02.2014    source источник


Ответы (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');
});
person Oleg    schedule 23.02.2014
comment
Да, это была проблема пространства имен /primus, из-за которой primus.js так и не был загружен. Я заметил, что также могу изменить пространство имен с помощью параметра pathname в конфигурации (спасибо Арноуту Каземьеру за указание). Теперь это тоже работает. - person Lars; 23.02.2014