Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

NodeJS为每个连接分配不同进程

  网络上一群喷NodeJS的,各种奇葩的理由都有。不过说NodeJS不好的都是因为拿NodeJS和其它Web后端语言去比较了。单比多网页的适用性,NodeJS确实和PHP差很远。但是NodeJS本身不是因开发网页而诞生的,而是作为一个服务器程序而诞生的。要对比的话不应该拿它和PHP比,应该和Python之类的比,而且比的是语言本身,不是各种模块的数量。算了,现在说这些也没意义。说NodeJS是单线程事件模式是人们最喜欢喷的地方,但是NodeJS单线程的根本原因只是缺少线程扩展模块而已。不过就目前而言,使用cluster模块创建子进程一样可以做的很好。下面是一个简单的服务器程序,具体看程序的注释就可以了。 var http=require('http');
var cluster=require('cluster');
var fs=require('fs');
var url=require('url');

//给ServerResponse添加end404方法
http.ServerResponse.prototype.end404=function(e){
  this.statusCode=404;
  this.end('404 Not Found');
  console.log(404+' '+e);
};
//给ServerResponse添加end403方法
http.ServerResponse.prototype.end403=function(e){
  this.statusCode=403;
  this.end('403 Forbidden');
  console.log(403+' '+e);
};
//给ServerResponse添加end500方法
http.ServerResponse.prototype.end500=function(e){
  this.statusCode=500;
  this.end('500 Internal Server Error');
  console.log(500+' '+e);
};
http.createServer(function(req,res){
  var worker,html,data,file,info,s;
  info=url.parse(req.url); //获取URL信息
  file='www'+info.pathname; //计算文件路径
  file=file.replace(/\/$/,'/index.njs'); //设置默认首页
  //文件不存在则返回404
  if(!fs.existsSync(file))return res.end404(req.url);
  //按类型操作文件
  if(/\.njs$/i.test(file)){
    //初始化输出
    html=[];
    //创建并调用子进程
    cluster.setupMaster({exec:file});
    worker=cluster.fork();
    //子进程结束时候输出
    worker.on('exit',function(e){
      switch(e){
        case 1:return res.end500(req.url);
        case 404:return res.end404(req.url);
        default:
          res.end(html.join(''));
          console.log(200+' '+req.url);
      };
      worker=null;
    });
    //子进程回调命令
    worker.on('message',function(e){
      for(var i in e)switch(i){
        case 'html':
          html.push(e[i]);
          break;
        case 'log':
          console.log(e[i]);
          break;
      };
    });
  }else if(/\.(img|jpg|png|ico|js|css)/i.test(file)){
    fs.readFile(file,function(e,d){
      res.end(d);
      console.log(200+' '+req.url);
    });
  }else res.end403(req.url);
}).listen(80);

console.log('HTTP在80端口...');
  这个程序只是使用目前官方提供的模块写的,虽然还有很多功能需要完善。现在来试试这个服务器代码吧。在网站根目录,也就是这个程序所在目录下的“www”文件夹中创建一个index.njs文件,并为这个页面文件编写代码。 //www/index.njs
process.send({html:'<h1>次碳酸钴</h1>'});
process.exit();
  然后运行服务器代码,并且访问网页。

  虽然这个服务器程序还没有完善,但是至少简单的GET请求响应是没有问题了。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^