我在使用iisnode获取节点表达应用程序时遇到了一些困难。我在iis中设置了一个简单的http pub / sub服务器。它通过POST接收消息,并将数据推送到相关的侦听客户端。代码...
服务器
var express = require('express');
var app = require('express').createServer();
var clients = {};
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
});
app.get('/pubsubleads/leads/:id', function(request, response) {
var id = request.params.id.toString();
response.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
clients[id] = response;
request.on('close', function(){
console.log('connection closing');
delete clients[id];
});
});
app.post('/pubsubleads/leads', function(request, response){
console.log('New post');
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end();
var id = request.body.id;
if(clients[id] != null) {
console.log('id = ' + id);
console.log('data = ' + request.body.data);
clients[id].write('id: ' + request.body.id + '\n');
clients[id].write('data: ' + request.body.data + '\n\n');
}
});
app.listen(process.env.PORT);
console.log('Server started on port ' + process.env.PORT);
客户端
var source = new EventSource('/pubsub/data/@Session.SessionID');
source.onopen = function (e) {
alert('onopen');
document.body.innerHTML += 'Connected <br>';
};
source.onmessage = function (e) {
alert('onmessage: ' + e.data);
document.body.innerHTML += e.data + '<br/>';
};
source.onerror = function (e) {
if (e.readyState == EventSource.CLOSED) {
alert('closed');
}
};
...传递给EventSource网址的参数是唯一标识此客户端的内容。
服务器和客户端托管在相同的根域下的不同子域中。我已确认服务器正在正确接收消息。我遇到的问题是客户端事件处理程序永远不会被命中。我已经尝试将客户端代码包装在$(document).ready()
中但没有任何影响。我已经在IIS之外复制了一个独立的节点进程,并且工作正常。
我在Windows 7 64位上使用Chrome 18,nodejs 0.6.18,iisnode,IIS 7.5。
我是新鲜的想法,并且未能找到任何在线讨论的类似问题。任何帮助将不胜感激。
答案 0 :(得分:3)
默认情况下,IIS在刷新之前缓存最多4MB的响应数据,这样可以在响应较短和静态文件时提高性能。您似乎打算随着时间的推移将短数据块流回客户端,并期望传递这些块的低延迟。
iisnode允许您通过在每次写入后强制刷新响应数据来覆盖此默认IIS行为。请将web.config中的system.webServer \ iisnode \ @flushResponse配置设置为true(https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config#L90)转这种行为。或者,如果升级到iisnode v0.1.19或更高版本,还可以使用新的iisnode.yml配置文件设置此值(有关详细信息,请参阅http://tomasz.janczuk.org/2012/05/yaml-configuration-support-in-iisnode.html)。
答案 1 :(得分:0)
EventSource没有与WebSockets相同的客户端API。您需要使用addEventListener
:
source.addEventListener('open', function (e) {
// opened
});
source.addEventListener('message', function (e) {
// e.data
});
source.addEventListener('error', function (e) {
// whoops
});