给出以下简单的网络服务器代码:
console.log('starting');
var server = require('http').createServer();
server.on('connection',function(socket){console.log('*server/connection');});
server.on(
'request',
function(request, response){
console.log('*server/request');
request.on(
'data',
function(chunk){
console.log('*request/data');
// <!> How do I abort next data calls from here?
}
);
request.on(
'readable',
function(chunk){
console.log('*request/readable');
// <!> How do I abort next readable calls from here?
}
);
request.on(
'end',
function(){
console.log('*request/end');
response.writeHead(200,"OK");
response.write('Hello');
response.end();
}
);
request.on('close',function(){ console.log('*request/close'); } );
request.on('error',function(){ console.log('*request/error'); } );
}
);
server.on('close',function(){console.log('server/close');});
server.on('checkContinue',function(request, response){console.log('*server/checkContinue');});
server.on('connect',function(request, socket, head){console.log('*server/connect');});
server.on('upgrade',function(request, socket, head){console.log('*server/upgrade');});
server.on('clientError',function(exception, socket){console.log('*server/clientError');});
server.listen(8080);
console.log('started');
提交POST或FILE时,我的on data函数被触发一次或多次或多次。有时(例如发送了一个巨大的大文件),
我想在发生数据事件时取消此操作并向用户触发on end函数 (稍后,我将显示“您的帖子/文件太大”)。我该怎么做?
正确的,符合规范的操作仅是尽早发送HTTP
413响应-
也就是说,一旦您检测到客户端发送的字节数超过了您想要处理的字节数。发送错误响应后是否终止套接字取决于您。这符合RFC 2616 :(添加了重点)
413请求实体太大
服务器拒绝处理请求,因为请求实体大于服务器愿意或能够处理的实体。 服务器可以关闭连接,以防止客户端继续请求。
接下来发生的事情并不理想。
该浏览器目前的行为是违反RFC 2616的§
8.2.2:
发送消息正文的HTTP /
1.1(或更高版本)客户端应该在传输请求时监视网络连接的错误状态。如果客户端看到错误状态,它应该立即停止发送主体。如果使用“块式”编码发送正文(第3.6节),则可以使用零长度的块和空的预告片来过早地标记消息的结尾。如果主体之前是Content-
Length标头,则客户端务必关闭连接。
Chrome和Firefox存在开放问题,但是不要指望很快会修复。
同样,这可能违反了规范(允许服务器提前发送响应并关闭连接),但是我也不希望浏览器在此之前很快得到修复。
更新: 从4/15开始,Chrome 可能会 在您提前关闭连接时显示413 HTML。仅当浏览器在Linux和Mac OS
X上运行时,此方法才有效。在Windows上,Chrome仍然显示ERR_CONNECTION_RESET
网络错误,而不是您发送的HTML。(IE
11和Firefox 37继续在所有平台上显示网络错误。)
因此,您可以使用传统的纯HTTP上传方式进行选择:
仅在上传运行完成后显示友好的错误消息。这浪费时间和带宽。
快速失败,但让用户困惑于浏览器的错误屏幕。
在这里最好的选择是使用AJAX上传器,您可以在其中更好地控制用户体验。您仍然应该提供传统的上传表单作为后备,并且我将使用“快速失败”选项(关闭套接字)来避免浪费时间和带宽。
这是一些示例代码,如果收到的请求超过1 kB,该示例代码将杀死该请求。我使用的是Express,但对节点的普通HTTP库也应如此。
注意: 实际上,您应该使用
强大的
多方来处理您的上载(这是Connect /
Express所使用的),并且它有自己的方式来监视上载数据。
var express = require("express")
, app = express();
app.get('/', function(req, res) {
res.send('Uploads > 1 kB rejected<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit"></form>');
});
app.post('/upload', function(req, res) {
var size = 0;
var gotData = function(d) {
size += d.length; // add this chunk's size to the total number of bytes received thus far
console.log('upload chunk', size);
if (size > 1024) {
console.log('aborting request');
req.removeListener('data', gotData); // we need to remove the event listeners so that we don't end up here more than once
req.removeListener('end', reqEnd);
res.header('Connection', 'close'); // with the Connection: close header set, node will automatically close the socket...
res.send(413, 'Upload too large'); // ... after sending a response
}
};
var reqEnd = function() {
res.send('ok, got ' + size + ' bytes');
}
req.on('data', gotData);
req.on('end', reqEnd);
});
app.listen(3003);
我是Gajarthan,我是jQuery的新手。如果用户未确认,我会尝试防止更改复选框。但当我第一次点击时它就不起作用了。点击第二次后,它正常工作。 这是我功能的总结 当我单击切换按钮时,它需要显示一个确认警报“你确定要继续吗?”如果我点击“是”。如果toggle inactive(非活动),则需要更改Active(活动)。如果toggle active,则需要更改inactive。如果我点击“否
使用on()方法绑定事件后,若希望取消绑定,则可以使用off()方法。off()方法根据传入参数的不同,有不同的实现逻辑。 version added: 2.0.0 .off( event , selector , handler ) event Type: String 需取消绑定的事件名称,例如:'tap' selector Type: String 选择器 handler Type: Fun
对应一个事件,假如是 click。A, B, C 都针对该事件绑定了多个监听函数。对于 B 元素,自身内置了一些监听函数,这些内置的监听函数没法获取,但可以为 B 元素增加新的监听函数。有没有方法不执行 B 元素的内置监听函数,但是 A, C 中的监听函数依然可以执行
我们如何捕捉“取消”事件并清除“角”文件输入控件?如果没有,是否有任何解决办法来清除当用户点击“取消”按钮时的文件上传?
我有多个自定义技能意图。我想处理取消所有自定义意图的事件。我怎么能得到取消被调用。 我们如何在node JS Alexa中处理这个问题
问题内容: 有一个新的API用于从JavaScript发出请求:fetch()。是否有任何内置的机制可以在飞行中取消这些请求? 问题答案: 现在支持截至2017年9月20日的参数,但目前 并非所有浏览器都支持此参数 。 2020更新: 大多数主流浏览器(Edge,Firefox,Chrome,Safari,Opera和其他一些浏览器)都支持该功能,该功能已成为DOM生活标准的一部分。(截至2020