一个很简单的node问题
发布于 11 年前 作者 gentlecolder 5822 次浏览 最后一次编辑是 8 年前

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这样只不是很浪费资源。

18 回复

不要写这么含糊的标题啊啊a啊a… 拼写有错, 代码没高亮… 新用户来访问, 新生成对应的数据来相应请求是都要做的 Node 用的是事件循环, Apache 是开子进程, 不那么耗资源

单线程啊…

要验证这个很简单.你写个 全局count 看一下count,访问一次是不是递增的…

以上代码等价于

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);

你自己跑一下这个例子吧…

嗯,谢谢。一定好好学习node

你个的代码怎么会每次+2而不是+1

…你是本机并且用的是ip 访问吧… 例如局域网: 192.168.1.100:8888 这样访问的话就会触发两次…

如果是用localhost:8888 就是一次…

至于为什么…补一下网络基础吧…

+2可能是因为很多浏览器可能会访问一个/favicon.ico的图标 就是地址栏前面显示的那个。

另:createServer是启动应用的时候只调用一次,就是你调用 node index.js的时候调用。

@gaddd 你用的localhost 也是 +2? 看来,我需要补一下网络基础了…

@gaddd 你是对的…看来是我想歪了…简单加一句就可以测试出来了.

console.log(request.url);

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 ,每次浏览器访问不会输出。

@youxiachai 嘿嘿,那个语法高亮是怎么弄的<code></code> <code>console.log(“Hello World”);</code>

@gentlecolder 在nodejs中外部的访问不是针对代码文件的,这不同于apache等服务器。 所有的访问是通过onRequest 然后执行里面的代码实际应用是按pathname和参数做路由。 http://www.nodebeginner.org/index-zh-cn.html 看一遍这个应该就明了了。

外部请求不是针对文件的,而是针对端口,node index.js(只执行一次,所以createServer也只会执行一次),会监听端口的请求,如果有请求进来,node会使用你传递给createServer的这个function处理这个请求,在这个函数中实现如何响应这个请求。

呵呵你问的这个问题够奇葩的,用户就是访问文件index.JS也不是直接执行js代码吧,也是要通过http服务器来访问的吧,也要通过http.createServer来访问吧,这个可不是浏览器端src="index.js"就加载一次了,服务器的任何文件都是http服务来进行的,说了这么多应该明白了吧

@youxiachai 什么情况啊,我试了一下,都是每次增加1的。。。

回到顶部