栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

NodeJS-使用Core NodeJS和原始Node解决方案通过进度条上传文件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

NodeJS-使用Core NodeJS和原始Node解决方案通过进度条上传文件

首先,您的代码确实有效。节点发送分块的响应,但是浏览器只是在等待更多响应,然后才显示它。

节点文档中的更多信息:

第一次调用response.write()时,它将把缓冲的头信息和第一个正文发送给客户端。第二次调用response.write()时,Node假设您将要流传输数据,并分别发送数据。也就是说,响应被缓冲到主体的第一块。

如果将content-type设置为html like

response.setHeader('Content-Type', 'text/html;charset=UTF-8');
,它将使chrome呈现内容,但这只有在我使用了一系列set
timeout调用以及内部response.write调用时才有效。当我尝试使用您的代码时,它仍然没有更新dom,因此我更深入地研究了…

问题在于,实际上取决于浏览器在合适时呈现内容,因此我设置了代码以发送ajax请求来检查状态,而不是:

首先,我更新了服务器,以将其状态仅存储在全局变量中,然后打开“ checkstatus”端点以读取它:

var http = require('http');var fs = require('fs');var status = 0;var server = http.createServer(function (request, response) {    response.writeHead(200);    if (request.method === 'GET') {        if (request.url === '/checkstatus') { response.end(status.toString()); return;        }        fs.createReadStream('filechooser.html').pipe(response);    }    else if (request.method === 'POST') {        status = 0;        var outputFile = fs.createWriteStream('output');        var total = request.headers['content-length'];        var progress = 0;        request.on('data', function (chunk) { progress += chunk.length; var perc = parseInt((progress / total) * 100); console.log('percent complete: ' + perc + '%n'); status = perc;        });        request.pipe(outputFile);        request.on('end', function () { response.end('nArchived Filenn');        });    }});server.listen(8080, function () {    console.log('Server is listening on 8080');});

然后,我更新了filechooser.html以检查ajax请求的状态:

<!DOCTYPE html><html><body><form id="uploadForm" enctype="multipart/form-data" action="/" method="post">    <input type="file" id="upload" name="upload"/>    <input type="submit" value="Submit"></form>Percent Complete: <span id="status">0</span>%</body><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script><script>    var $status = $('#status');        $('form').on('submit', function() {        var longPoll = setInterval(function () { $.get('/checkstatus').then(function (status) {     $status.text(status);     //when it's done, stop annoying the server     if (parseInt(status) === 100) {         clearInterval(longPoll);     } });        }, 500);    });</script></html>

请注意,尽管我没有结束响应,但是服务器仍然能够处理传入的状态请求。

因此,为回答您的问题,Dahl被一个flickr应用程序迷住了,他看到该文件上传了文件并经过长时间轮询以检查其状态。他之所以着迷,是因为服务器在继续处理上载时能够处理这些ajax请求。这是多任务的。看到他在这段视频中恰好是14分钟谈论它-
甚至说,“这就是它的工作原理……”。几分钟后,他提到了iframe技术,并将长轮询与简单的ajax请求区分开来。他指出,他想编写针对这些行为优化的服务器。

无论如何,在那些日子里这并不常见。大多数Web服务器软件一次只能处理一个请求。而且,如果他们去了一个数据库,调用了一个Web服务,又与文件系统进行了交互,或者类似的事情,那么进程将坐下来等待它完成,而不是在等待时处理其他请求。

如果要同时处理多个请求,则必须启动另一个线程或使用负载平衡器添加更多服务器。

另一方面,Nodejs通过执行非阻塞IO非常有效地利用了主流程。Node并不是第一个这样做的节点,但是在非阻塞IO领域中使它与众不同的是它的所有默认方法都是异步的,因此您必须调用“
sync”方法来做 错事 。这迫使用户去做 正确的 事。

另外,应该注意,选择javascript的原因是因为它已经是一种在事件循环中运行的语言。有人 提出
处理异步代码。您可以具有匿名函数和闭包,这使异步操作更易于维护。

我还想提到,使用Promise库还可以使编写异步代码更加简洁。例如,请查看bluebirdjs-它具有一个不错的“
promisify”方法,该方法将转换对象原型上具有回调签名(function(error(params){}))的函数以代替返回promise。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/401573.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号