简单来说, Node.js是服务器端JavaScript 。 这些天来越来越热闹。 如果您听说过它,或者对学习和使用它感兴趣,那么这篇文章适合您。
那么在服务器中使用JavaScript到底有什么需求呢? 为了弄清楚Node.js的概念,我想将其与普通的服务器端语言(例如PHP)进行比较。 Node.js使用基于事件的服务器执行过程,而不是PHP中的多线程执行。
为了进一步解释它,我们将讨论Node.js是什么的思想以及一些托管服务提供商的建议和安装技巧 。 需要具备JavaScript,jQuery和Ajax的中级知识,但是我们还将提供示例,以使您更轻松地理解整个内容,甚至可以对其进行操作,因此,让我们进一步了解Node.js!
让我们考虑一种情况:
考虑一个网站,您需要在其中从另一台速度慢的Web服务器动态加载内容。 在PHP中,您可以通过2种方式来实现它:将其编码为一个简单文件并将其编码为另一个脚本 ,然后以多线程方法执行它 。
<div>
<img src="https://s2.51cto.com/images/blog/202401/03191530_659541d228c5766400.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=" alt="多线程执行">
</div>
在第一种方法中,即使代码很简单,执行也会在访问慢速Web服务器的位置暂停一会儿 。 第二种方法在性能方面进行了优化,但是很难编写代码,并且具有多线程管理开销。 除服务器端JavaScript(即Node.js)外,大多数Web编程语言的情况都相似。
Node.js有什么区别? 为了理解Node.js,您必须牢记浏览器中JavaScript基于事件的编程 。 我们在这里使用相同的技术。 无需使用单独的线程,而是将一个函数附加到上述 “缓慢的Web服务器访问” 的完成事件上,因此您可以在上述优化的第二个选项中获得全部功能 ,而没有任何多线程开销。
Node.js入门
Node.js是JavaScript 。 为什么我们不能在客户端到服务器上利用基于事件JavaScript功能? 这种想法可能导致了Node.js的发展。
<div>
<img src="https://s2.51cto.com/images/blog/202401/03191530_659541d23d13a96617.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=" alt="基于事件的执行">
</div>
就是说,Node.js的主要亮点- 它是基于事件的异步函数 。 它使用事件循环,而不是等待I / O操作(访问外部Web服务,访问硬件)。
当服务器等待任何其他操作时,Node.js仍可以利用其处理能力 。 这使Node.js 可扩展到数百万个并发连接。
JavaScript如何在服务器上运行?
Node.js在v8环境下工作 -它是运行JavaScript代码的虚拟机或JavaScript引擎 ,因此对于托管,您不能使用普通的Web主机。 您将需要具有v8环境的环境 。
以下是有关Node.js托管的一些提供程序建议:
安装Node.js
Node可以在Linux,Macintosh和Solaris操作系统上完美运行 。 在Windows上,您可以使用Cygwin仿真层进行安装。 Windows中的构建都不令人满意,但是仍然可以运行某些东西。
使用make
来构建和安装node.js(在命令行上执行以下操作)。 需要Git
git clone --depth 1 git://github.com/joyent/node.git
cd node
git checkout v0.4.11
export JOBS=2
mkdir ~/local
./configure --prefix=$HOME/local/node
make
make install
echo 'export PATH=$HOME/local/node/bin:$PATH' >> ~/.profile
echo 'export NODE_PATH=$HOME/local/node:$HOME/local/node/lib/node_modules' >> ~/.profile
source ~/.profile
对于Mac用户,您可以从https://sites.google.com/site/nodejsmacosx/中以软件包形式安装Node.js,这很容易解释。
测试节点安装
为了检查您是否成功安装Node,我们可以尝试一个非常简单的控制台“ Hello World”程序。 创建一个名为“ test.js ”的文件,并将以下代码写入其中。
var sys = require("sys");
sys.puts("Hello World");
它将sys
类加载到变量sys
。 然后,它使用sys
对象执行控制台任务。 sys.puts
是类似于C ++中的cout
的命令,因此,要运行上面的脚本,请转到命令提示符并通过以下命令运行它:
node test.js
如果安装成功,则屏幕上将显示hello world输出。
<div>
<img src="https://s2.51cto.com/images/blog/202401/03191530_659541d25940859843.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=" alt="你好,世界">
</div>
创建一个HTTP服务器
现在是时候使用Node.js通过Web服务器创建“ Hello World”了。 这就是我们要做的–我们创建一个服务器,无论URL是什么,它都会在端口8080上向本地主机输出“ Hello World” ,从而使您知道事件是什么。
var sys = require("sys"),
my_http = require("http");
my_http.createServer(function(request,response){
sys.puts("I got kicked");
response.writeHeader(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8080);
sys.puts("Server Running on 8080");
Node.js中最有趣的部分是其基于事件的编程。 为了创建HTTP服务器,我们需要HTTP库 ,因此我们继续使用my_http
添加它。 我们通过以下功能创建服务器:
my_http.createServer(function(request,response){}).listen(8080);
每次在端口8080中触发事件时,都会执行作为第一个参数给出的函数,因此该函数本身建议节点侦听端口8080中的事件 。 为了检测到这一点,我添加了一条“ 我被踢 ”消息,无论何时收到请求,该消息都会显示在控制台屏幕上。
request
对象包含有关已向服务器发出的请求的所有信息 。 例如,它包含URL字符串。 response
对象是处理服务器响应的对象。 首先,我们将响应的标题设置为text/plain
内容,然后输出“ Hello World ”,然后结束输出流。 200是状态响应。
好吧,以上示例是一个非常简单的示例,但是我们可以看到,在浏览器中为同一服务器提供的任何URL,我们都会得到与“ Hello World”一样的输出。
创建简单的静态文件服务器
让我们在下一个教程中创建一个简单的静态文件服务器。
var sys = require("sys"),
my_http = require("http"),
path = require("path"),
url = require("url"),
filesys = require("fs");
my_http.createServer(function(request,response){
var my_path = url.parse(request.url).pathname;
var full_path = path.join(process.cwd(),my_path);
path.exists(full_path,function(exists){
if(!exists){
response.writeHeader(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
}
else{
filesys.readFile(full_path, "binary", function(err, file) {
if(err) {
response.writeHeader(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.end();
}
else{
response.writeHeader(200);
response.write(file, "binary");
response.end();
}
});
}
});
}).listen(8080);
sys.puts("Server Running on 8080");
上面的代码非常简单,我们将以块的形式进行讨论。
var sys = require("sys"),
my_http = require("http"),
path = require("path"),
url = require("url"),
filesys = require("fs");
该程序需要所有这些库。 在下面的代码中将清楚其用法。
var my_path = url.parse(request.url).pathname;
var full_path = path.join(process.cwd(),my_path);
如前所述, request
对象具有请求详细信息。 我们使用包含的URL类的parse
函数来获取请求URL的pathname
。 获取路径名后,我们将其与当前工作目录的路径连接起来,以获取文件的完整路径。
对于连接URL,我们在路径库中有一个称为join
的函数。
path.exists(full_path,function(exists){
获取完整路径后,我们检查该功能是否exists
。 检查完成后,将调用回调函数并将其作为第二个参数传递。
if(!exists){
response.writeHeader(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
}
else{
filesys.readFile(full_path, "binary", function(err, file) {
if(err) {
response.writeHeader(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.end();
}
else{
response.writeHeader(200);
response.write(file, "binary");
response.end();
}
});
}
现在在回调函数中,如果文件不存在,我们将发送“ 404页面未找到 ”错误。
如果找到该页面,则我们通过文件系统中的readFile
函数读取文件。 我们还可以看到在其中定义的readFile
函数的回调函数。 如果读取文件没有错误,则将显示该文件。 如果存在错误,则返回状态500和错误文本。
我还建议将上一教程的代码包装到一个函数中,以便您可以在下一教程中使用它或将来使用。
var sys = require("sys"),
my_http = require("http"),
path = require("path"),
url = require("url"),
filesys = require("fs");
my_http.createServer(function(request,response){
var my_path = url.parse(request.url).pathname;
var full_path = path.join(process.cwd(),my_path);
path.exists(full_path,function(exists){
if(!exists){
response.writeHeader(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
}
else{
filesys.readFile(full_path, "binary", function(err, file) {
if(err) {
response.writeHeader(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.end();
}
else{
response.writeHeader(200);
response.write(file, "binary");
response.end();
}
});
}
});
}
my_http.createServer(function(request,response){
var my_path = url.parse(request.url).pathname;
load_file(my_path,response);
}).listen(8080);
sys.puts("Server Running on 8080");
就这样。 希望这对Node.js有所帮助。 在下一篇文章中,我将向您展示如何使用Node.js加载和显示喜欢的Facebook人数 。 敬请关注!
编者注:这篇文章是由Geo Paul为Hongkiat.com撰写的。 Geo是一个独立的Web / iPhone开发人员,喜欢使用PHP,Codeigniter,WordPress,jQuery和Ajax。 他有4年PHP经验和2年iPhone应用程序开发经验。
翻译自: https://www.hongkiat.com/blog/node-js-server-side-javascript/