我试图将css和scss文件合并到我的构建目录中的main.css文件中.它的工作,但不是正确的顺序.scss文件中的样式属性需要位于main.css文件的底部,因此它们会覆盖其余部分.
我的Gulp任务看起来像这样:
//CSS
gulp.task('css', function () {
var cssTomincss = gulp.src(['dev/css/reset.css', 'dev/css/style.css','dev/css/typography.css', 'dev/css/sizes.css']);
var cssFromscss = gulp.src(['dev/css/*.scss'])
.pipe(sass());
return es.merge(cssTomincss, cssFromscss)
.pipe(concat('main.css'))
.pipe(minifyCSS())
.pipe(gulp.dest('build/css'))
});
Run Code Online (Sandbox Code Playgroud)
我首先用变量定义源代码.我正在使用gulp-sass插件将scss文件转换为普通的css(.pipe(sass)),然后将两者与es.merge函数合并并将它们连接到main.css中.
问题是,.scss文件的样式属性最终会出现在main.css文件的顶端.我需要他们在底部.所以他们需要在底部连接起来.
有关如何做到这一点的任何线索?
我有一个GET和POST路由的设置,想法是POST到路由触发事件,GET路由是服务器发送的事件流,每次触发POSTed事件时触发...但是,我我觉得我做错了,因为事件听众似乎经常被添加,尽管只有一个事件流订阅者......我做错了什么?
var events = require('events'),
EventEmitter = events.EventEmitter,
rr = new EventEmitter();
app.post('/api/:boardname/remoterefresh', function(req, res){
var boardname = req.param('boardname'),
data = new Date().getTime();
rr.emit("refresh-"+boardname, data)
res.json({data: data})
});
app.get('/api/:boardname/remoterefresh', function(req, res){
var boardname = req.param('boardname')
rr.on("refresh-"+boardname, function(data){
setTimeout(function(){
res.write('data: '+data+'\n\n');
}, 1000)
});
req.socket.setTimeout(Infinity);
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
res.write('\n');
req.on('close', function(){
console.log('closed')
rr.removeListener("refresh-"+boardname, function(){
//
})
})
})
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Rails 4的直播流实现文本/事件流.它工作得很好,我遇到的唯一麻烦就是我无法在不发送任何消息的情况下检查连接是否存在.
我想出的唯一解决方案是使用循环刻度生成器创建支持通道,以便某些后台任务将定期发送消息.但它似乎是凌乱和不可靠的.更好的解决方案?
这是我的控制器:
require 'persistency/sse'
require 'persistency/track'
class PersistencyController < ApplicationController
include ActionController::Live
def stream
response.headers['Content-Type'] = 'text/event-stream'
sse = Persistency::SSE.new(response.stream)
track = Persistency::Track.new(current_user)
redis = Redis.new
begin
redis.subscribe(:info, :chat) do |on|
on.message do |channel, message|
sse.write({ :message => message }, :event => channel)
end
end
rescue IOError
ensure
track.close
sse.close
end
end
end
Run Code Online (Sandbox Code Playgroud) 我正在使用SSE和内置逻辑的EventStream for javascript.在onopen返回成功结果的同时,onmessage回调不起作用.奇怪的是,在EventStream选项卡的Chrome中,数据结果按照我的预期列出.
这是我为EventSource提供的JS代码段
var eventSource;
$(function () {
eventSource = new EventSource('get/status/');
eventSource.onopen = function () {
console.log("Sse connection opened");
};
eventSource.onerror = function () {
console.log("error occured");
};
eventSource.onmessage = function (event) {
console.log("received");
};
});
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,数据正在被释放但从onmessage未被触发.任何人都可以向我解释这种行为吗?
编辑:onopen并onerror做两件事.
我的前端有一个 EventSource 侦听器,调用一个复杂的后端方案。此代码块是用 Typescript 编写的。
import * as EventSource from 'eventsource';
private streamData() {
let source = new EventSource('http://localhost:3000/websocket/server/stream');
source.onopen = (e) => {
};
source.onmessage = (e) => {
console.log('id: ' + (<any>e).lastEventId + '; type: ' + e.type + ' data: ' + e.data);
};
}
Run Code Online (Sandbox Code Playgroud)
我将以下响应发送回我的服务器:
res.write('id: ' + this.messageId++ + '\n');
res.write('type: message\n');
res.write('data: ' + message + '\n\n');
res.flush();
Run Code Online (Sandbox Code Playgroud)
但是,在 xhr 监视器上,我看不到 EventStream 数据。
我在前端获取信息,所以这对我来说不是阻塞问题,但可能会在以后的调试中造成一些问题。
javascript http event-stream google-chrome-devtools typescript
我想每2分钟将数据推送给用户.使用EventSource需要每29秒额外推送空字节以保持连接打开.WebSocket不需要这样的ping.为什么EventSource连接会定期关闭并重新打开?是因为在HTTP中没有好的内置方式来检查连接是否仍然打开或其他原因?
我正在尝试创建一个Flask服务器,使用sse将数据流式传输到客户端.下面的测试代码似乎可以解决问题,但我偶然发现了与处理客户端断开连接相关的问题.
使用Firefox作为客户端(版本28或29)时,数据按预期开始流式传输.但是,当我重新加载页面时,会打开一个新流(如预期的那样),但旧流仍然存在.处理流的eventgen()线程永远不会终止.在其他客户端上(我尝试使用Yaffle的Polyfill EventSource实现以及Chrome),重新加载或关闭页面会导致客户端断开连接,从而导致服务器端套接字错误10053(客户端与主机断开连接).这将终止循环并仅使活动流保持活动状态,这是预期的行为.
使用Process Explorer,我注意到客户端(Firefox)端的TCP连接挂起状态FIN_WAIT2,而服务器端的连接挂起状态CLOSE_WAIT.奇怪的是,在运行Firefox的3台机器中的1台(所有Win 7 x64)上我测试了这一点,断开连接正确处理.在Python 2.6.5和2.7.6上运行产生了相同的结果.
我还尝试用基于greenlet的gevent WSGIserver替换内置的Flask服务器,但这会产生完全相同的行为.此外,应该使用某种形式的线程/ eventlet,因为否则运行eventgen()循环会阻塞服务器.
下面的测试代码在浏览到localhost:5000时为make_html()中定义的页面提供服务,并打开一个到/ stream的流.该流显示格式{"content":0.5556278827744346,"local_id":4,"msg":6}的按摩,其中local_id是打开的流的id,msg是此流中当前消息的编号.
import time, random
import flask
from flask import Flask, json
def make_html():
return """
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script type=text/javascript>
var source = new EventSource('/stream');
source.onmessage = function (event) {
var data = event.data;
var logdiv = $('#log');
logdiv.empty();
logdiv.append('<div class="event">' + data + '</div>');
};
</script>
<h1>Log</h1>
<div id=log>Log ...</div>
<hr />
"""
# ---- Flask app ----
app = Flask(__name__)
@app.route('/')
def index():
return make_html()
counter …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取有关在 NodeJs 中使用EventSource时出现的错误的信息,我想您可以通过以下示例更好地理解我:
var url = 'http://api.example.com/resource'
var EventSource = require('eventsource');
var es = new EventSource(url);
es.onmessage = function(e) {
console.log(e.data);
};
es.onerror = function(event) {
console.log(event);
};
Run Code Online (Sandbox Code Playgroud)
在onerror函数中,我想获取有关错误的信息,但该错误以及对象event是空的或未定义的es(嗯,这个对象只是带有一对大括号{})。我想在出现错误时读取响应标头,例如:
es.onerror = function(e) {
console.log(e.header.location);
};
Run Code Online (Sandbox Code Playgroud)
这可能吗?我缺少什么?我认为答案应该很简单,但我是 NodeJs 的新人。
我有一个php脚本,可以通过验证从csv文件导入大数据.
为此,我需要向用户显示进度.我已经使用了Event Streaming.
当我回应一些东西时,我希望它一个接一个地转移到客户端而不是服务器批量发送整个输出.
我已经玩过ob_start(),ob_implicit_flush()和ob_flush(),但它们没有用.
我的脚本在另一台服务器上工作得很好.下面给出了服务器配置:
代码未按要求响应的服务器配置,即
OS: Linux PHP Version 5.4.36-0+deb7u3 Server API: CGI/FastCGI Memory_limit: 128M output_buffering: no value
正如我所说,代码在另一台具有几乎相同配置的服务器上正常工作,即
OS: Linux PHP Version 5.4.37 Server API: CGI/FastCGI Memory_limit: 256MB output_buffering: no value
以下是我发送事件的示例代码:
<?php
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Access-Control-Allow-Origin: *");
$lastEventId = floatval(isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? $_SERVER["HTTP_LAST_EVENT_ID"] : 0);
if ($lastEventId == 0) {
$lastEventId = floatval(isset($_GET["lastEventId"]) ? $_GET["lastEventId"] : 0);
}
echo ":" . str_repeat(" ", 2048) . "\n"; // 2 kB padding for IE
echo "retry: 2000\n";
// …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Flask应用程序生成大型PDF。pdf生成包括生成十个长pdf,然后将它们合并在一起。该应用程序使用带有标志的Gunicorn运行:--worker-class gevent --workers 2。
我的服务器端代码如下所示:
@app.route ('/pdf/create', methods=['POST', 'GET'])
def create_pdf():
def generate():
for section in pdfs:
yield "data: Generating %s pdf\n\n" % section
# Generate pdf with pisa (takes up to 2 minutes)
yield "data: Merging PDFs\n\n"
# Merge pdfs (takes up to 2 minutes)
yield "data: /user/pdf_filename.pdf\n\n"
return Response(stream_with_context(generate()), mimetype='text/event-stream')
Run Code Online (Sandbox Code Playgroud)
客户端代码如下所示:
var source = new EventSource(create_pdf_url);
source.onopen = function (event) {
console.log("Creating PDF")
}
source.onmessage = function (event) {
console.log(event.data);
}
source.onerror = function (event) {
console.log("ERROR");
} …Run Code Online (Sandbox Code Playgroud) event-stream ×10
javascript ×5
flask ×2
html5 ×2
http ×2
node.js ×2
python ×2
disconnect ×1
eventemitter ×1
express ×1
firefox ×1
gevent ×1
gulp ×1
gulp-sass ×1
gunicorn ×1
linux ×1
php ×1
typescript ×1
webkit ×1
websocket ×1