我已经度过了许多痛苦的月份,现在我已经准备好让它进入“什么是网站节点js-is-a-great-lie-!!!”这个网站。
所有NodeJS教程都讨论了如何创建网站。完成后,它可以工作。但对于一个人一次。发送到端口的所有请求都将被先到先得的情况阻止。为什么?因为发送到nodejs服务器的大多数请求必须被解析,数据库请求的数据,计算和解析的数据,响应准备并发送回ajax调用。 (这只是一个简单的网站示例)。
同样适用于身份验证 - 发出请求,解析数据,进行身份验证,创建会话并将其发送回请求者。
无论你如何涂糖 - 所有要求都是这样做的。是的,您可以使用异步功能,这将缩短在某些部分上花费的时间,是的,您可以尝试承诺,是的,您可以使用群集,是的,您可以使用分叉/产生等等...结果始终是相同的:端口被阻止。
我尝试使用引用进行响应,以便我们可以使用套接字将数据传回并将其与引用相匹配 - 这也阻止了它。
问题的关键在于:当你寻求帮助时,每个人都想要所有类型的代码示例,但绝不会去帮助实际有效的答案。整个世界!!!!!这让我得出了nodeJS不适合网站的答案。
我阅读了很多有关此问题的请求,所有这些请求都得到满足:“你必须正确编码”..!真?是不是没有NodeJS技术娴熟,经验丰富的人可以在这个问题上给出答案???? !!!!!
大多数NodeJS编码器都来自PHP方面 - 所有使用PHP的网站都不必为了显示网页而使用任何解决方法,并且它永远不会同时阻止2个人。感谢网络服务器。
那么为什么NodeJS社区不能在这个问题上找到某种方式而不是:“代码小心”??? !!!
他们想要的例子 - 每个例子都满足:“好吧,这是一个阻止代码,做另一种方式”,或“仔细编码”!来一个人!!!
考虑以下场景:一个用户,一个页面,包含4个记录列表。从理论上讲,所有列表都应该独立填写记录。由于数据的请求,准备和响应方式正在发生什么,现实中的每个列表都在等待下一个完成。仅在一个会议上就是这样。
2个人,同时2个课程怎么样?
所以我的问题是:NodeJS适用于网站,如果是,任何人都可以用短代码显示和证明这一点吗?如果您无法证明,那么答案是:“NodeJS不适合网站!”
以下是基于最简单教程的示例,它仍在阻止:
var express = require('express'),
fs = require("fs");
var app = express();
app.get('/heavyload', function (req, res) {
var file = '/media/sudoworx/www/sudo-sails/test.zip';
res.send('Heavy Load');
res.end();
fs.readFile(file, 'utf8', function (err,fileContent) {
});
});
app.get('/lightload', function (req, res) {
var file = '/media/sudoworx/www/sudo-sails/test.zip';
res.send('Light Load');
res.end();
});
app.listen(1337, function () {
console.log('Listening!')
});
现在,如果你去“/ heavyload”它会立即响应,因为这是发送到浏览器的第一件事,然后nodejs继续读取一个繁重的文件(一个大文件)。如果您现在同时转到第二个调用“/ lightload”,您将看到它正在等待加载文件,以便在继续浏览器输出之前从第一个调用完成。这是一个最简单的例子,说明nodejs如何在处理php和类似脚本语言中的简单方法时失败。
如前所述,我在nodejs程序员的职业生涯中尝试了多达20种不同的方法。我非常喜欢nodejs,但是我无法克服这个障碍......这不是一个抱怨 - 这是一个求助的呼吁,因为我在我的终点路上有nodejs,我不知道该怎么办。
我非常感谢你。
答案 0 :(得分:0)
是适合网站的NodeJS
肯定是的。
任何人都可以通过短代码展示和证明这一点
没有
所有使用PHP的网站都不必使用任何解决方法 为了显示一个网页,它永远不会阻止2人 同一时间。
Node.js也不需要任何解决方法,它只是无阻塞地工作。
要更广泛地回答您的问题/投诉:
单个node.js
计算机可以轻松地充当网站的网络服务器并处理多个会话(实际上数百万),而无需任何解决方法。
如果您来自PHP
网络服务器,可能不是尝试将现有代码迁移到新的Node
网站,而是首先使用在线简单进行游戏Node.js
+ express
的网站示例,如果效果很好,您可以开始添加需要长时间运行的流程的代码,例如从DB读取或读取/写入文件并验证访问者是否被阻止(他们不应该阻止)。
请参阅this tutorial了解如何开始使用。
更新示例代码
要修复提供的示例代码,您应该将fs.readFile
电话转换为fs.createReadStream
。对于大型文件,readFile
不太值得推荐,我认为readFile
字面上没有阻止任何内容,但是需要分配和移动大量字节可能会阻塞服务器,createReadStream
使用块来代替这在CPU和RAM上要容易得多:
rstream = fs.createReadStream(file);
var length = 0;
rstream.on('data', function (chunk) {
length += chunk.length;
// Do something with the chunk
});
rstream.on('end', function () { // done
console.log('file read! length = ' + length);
});
将代码切换为createReadStream
后,我可以在约3毫秒的时间内继续拨打heavyload
/ lightload
我应该写的更好的答案
Node.js
是一个单一流程架构,但它具有多进程功能,使用cluster模块,它允许您编写主/代码代码,在多个进程上分配多个工作负载
您还可以使用pm2为您执行群集,它有一个内置的负载均衡器可以分配到工作,还可以在不停机的情况下进行扩展/缩小,请参阅this。
在您的情况下,当一个进程正在读/写一个大文件时,其他进程可以接受传入的请求并处理它们。
答案 1 :(得分:0)
所以这就是我发现的。我将用一个阻塞代码的例子来回答它:
for (var k = 0; k < 15000; k++){
console.log('Something Output');
}
res.status(200).json({test:'Heavy Load'});
这会阻塞,因为它必须长时间执行for循环,然后在完成后它将发送输出。
现在,如果您执行相同的代码,则不会阻止:
function doStuff(){
for (var k = 0; k < 15000; k++){
console.log('Something Output');
}
}
doStuff();
res.status(200).json({test:'Heavy Load'});
为什么呢?因为函数是异步运行的......!那么我如何将结果响应发送给请求客户端?目前我这样做:
完成!一点解决方法(如前所述),但它正在工作!它确实需要一个socket来监听。这就是我对NodeJS中这种端口阻塞情况的解决方案。
还有其他方法吗?我希望有人用另一种方式回答,因为我仍然觉得这是一些解决方法。 EISH! ;)