var http = require(“http”);
http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write(“Hello World”); response.end(); }).listen(8888);
上面这段代码写在index.JS 里是不是表示每次有一个用户来访问都会createServer 生成一个http服务器,这样很多人来访问就会有很多服务器产生。但是像appach 就只有一个服务器。node这样只不是很浪费资源。
以上代码等价于
var http = require(“http”);
var server = http.createServer();
server.listen(6001);
server.on('connection’, function(){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(“Hello World”);
response.end();
})
每次有访问过来,只会触发’connection’里面的代码。
createServer()参数如果是function,node会自动监听’connection’。
我的意思是,外部的请求都是针对文件的,比如客户访问了index.JS, 然后文件中var server= http.createServer();就等于实例化了一个sever对象,该对象是注册了事件监听器的,它监听6001 端口的connection事件。那么很多客户来访问index.JS 页面,是不是都会重复实例化sever对象还是公用这个之前生成的对象,可不可以写个代码测试一下
个人感觉楼上几个回复都已经很清楚了…
你想一下,单线程的玩意,你的对象一旦创建,就一直活在内存里面,无论你怎么访问,还是这个对象,这个与apache过来一个访问创建一个线程不同的.
这个也是nodejs 的特性,没有这个特性的话,干嘛要选择node …
要验证很简单.我们只需在http 创建一个属性,如果是重复实例化的count 应该会一直输出 1,共用的话,就会不断递增…
var http = require("http");
http.count = 0;
http.createServer(function(request, response) {
console.log(++http.count);
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
你自己跑一下这个例子吧…
+2可能是因为很多浏览器可能会访问一个/favicon.ico的图标 就是地址栏前面显示的那个。
另:createServer是启动应用的时候只调用一次,就是你调用 node index.js的时候调用。
var http = require(“http”);
function onRequest(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write(“Hello World”); response.end(); } http.createServer(onRequest).listen(8888); console.log(“create a server instance”);
这样子运行一下就知道,每次运行node index.js的时候会输出 create a server instance ,每次浏览器访问不会输出。
@gentlecolder 在nodejs中外部的访问不是针对代码文件的,这不同于apache等服务器。 所有的访问是通过onRequest 然后执行里面的代码实际应用是按pathname和参数做路由。 http://www.nodebeginner.org/index-zh-cn.html 看一遍这个应该就明了了。
外部请求不是针对文件的,而是针对端口,node index.js(只执行一次,所以createServer也只会执行一次),会监听端口的请求,如果有请求进来,node会使用你传递给createServer的这个function处理这个请求,在这个函数中实现如何响应这个请求。