nodejs 从helloworld到高质量的后台服务server的一点思考

---恢复内容开始---

  新公司用的nodejs作为app和网站的后台服务server,所以最近对nodejs一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我和写后台接口的哥哥的一段对话:

  后台:过两天的后台管理你写的话,用express写还是不用?

  我  :看了两天后台源码,我觉得用express更省力一些,因为要牵涉到一些界面操作,用express创建项目应用模板和其他一些工具更方便,但是从工作分配上来说的话,用自己写的server代码结构更清晰,前后端完全分离,互不影响。

  后台:了解RESTful吗?

  我  :了解过一点,面试被问到过。(面试确实被问到过,回去之后百度了下,但是忘了)

  然后后台哥哥给我解释了下RESTful相关的一些东西,但是我有点不是太明白。

  在后台哥哥写的后台api server中,按照最基本的server机构写的,上代码:

  server.js

var http=require(‘http‘);
var router=require(‘./router‘),
    url=require(‘url‘),
    serverPort=8888;
var logger=require(‘./common‘).logger;

function start(router,handler){
    function onRequest(request,response){

        request.setEncoding(‘UTF-8‘);

        var postData="";
        request.addListener(‘data‘,function(postDataChunk){
            postData += postDataChunk;
        });

        request.addListener(‘end‘,function(){
            logger.info(‘Server is normal,Request recieved...‘);
            router(request,response,postData,handler);
        });

    }

    http.createServer(onRequest).listen(serverPort);
    logger.info(‘Server start on port:‘+serverPort);
}

logger.trace(‘Entering cheese testing‘);

exports.start = start;

router.js:

var url=require(‘url‘);
var fs=require(‘fs‘);
function router(request,response,postData,handler){
	var pathname=url.parse(request.url).pathname;
	console.log(‘ request received at ‘+pathname);
	console.log(‘ pathname:‘+pathname);
	console.log(‘ handler[pathname]:‘+handler[pathname]);
	if(typeof handler[pathname] === ‘function‘){
		handler[pathname](request,response,postData);
	}

	else{
		console.log(‘read resource here ...,now reading resources is : >>> ‘+pathname);
		fs.readFile(__dirname+pathname,function(err,data){
			if(err){
				response.writeHead(404,{‘content-type‘:‘text/html‘})
				response.write(‘<center><h1 style="font-family:microsoft yahei">‘);
				response.write(‘404,Sorry ,not found your visiting page...‘);
				response.write(‘</h1></center>‘)
				response.end();
			}
			else{
				response.write(data);
				response.end();
			}
		});
	}
}

exports.router=router;

  

requestHandlers.js:

var logger = require(‘./common‘).logger;

var util=require(‘util‘);

function response_err(response,err){
	var rdata={};
	rdata[‘result‘]=‘-1‘;
	rdata[‘message‘]=err;
	response.write(JSON.stringify(rdata));
	response.end();

	if(err.code === ‘PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR‘){
    	process.exit(0);
    }

    logger.info(‘<<< response_err.‘, JSON.stringify(rdata));
}

function response_success(response,rdata){
	rdata[‘result‘]=‘0‘;
	response.write(JSON.stringify(rdata));
	response.end();

	logger.info(‘<<< response_success.‘, JSON.stringify(rdata));
}

function login(request,response,postData){
	redirect_login(request,response,postData,function(err,rdata){
		if(err){
			response_err(response,err);
		}else{
			response_success(response,rdata);
		}
	});
}
function qzone(request,response,postData){

function teacherList(request,response,postData){
	redirect_teacherList(request,response,postData);
}
exports.index=redirect_index;
exports.login=login;

index.js:

var http= require(‘http‘),
	router=require(‘./router‘),
	requestHandlers=require(‘./requestHandlers‘),
	server=require(‘./server‘),
	cluster=require(‘cluster‘),
	cpuNums=require(‘os‘).cpus().length;

var handlers={};

handlers[‘/oper/login‘]=requestHandlers.login;

if(cluster.isMaster){
	console.log(‘Master work start ...‘);
	for(var i=0;i<cpuNums;i++){
		cluster.fork();
	}

	cluster.on(‘exit‘,function(worker,code,signal){
		console.log(‘worker ‘+worker.process.pid +‘ died ...‘);
	});

}else{
	server.start(router.router,handlers);
}

  

都是节选代码,有的地方式开发用的,为了避免泄露工作方面的,就节选了。

结构是这么个结构,然后再慢慢添加需要的模块,结合nginx的反向代理使用,很ok。

时间: 2024-10-09 10:52:11

nodejs 从helloworld到高质量的后台服务server的一点思考的相关文章

使用vue1.0+es6+vue-cli+webpack+iview-ui+jQuery 撸一套高质量的后台管理系统

首先按照vue.js官网的指令安装: 1.本地安装好node.js 2.根据官方命令行工具 详情 这样一个官方的脚手架工具就已经搭建好了:但是有一点需要注意的是由于现在按照官方的搭建方法是搭建vue2.0如果我们是新手想先搭建1.0的该如何呢.很简单:vue init webpack#1.0 my-project 就好了 开始搭建我们需要的东西了: 在package.json中我们可以看到 我们的 dependencies下面有一个vue1.0.28的版本信息:这里面集成的是vue的信息:我们可

高质量的HTML

本系列源自<编写高质量代码-web前端开发修炼之道> HTML,CSS,JavaScript三者中,HTML作为结构,CSS作为修饰,JavaScript作为控制.不管是在前端还是后台,结构都是非常重要的,使用HTML时必须要考虑语义化. 1.如何确定你的标签是否语义化? 浏览器会给标签给定默认样式,所以就算不用CSS修饰也能体现一些简单的样式.因此判断一个网页标签是否语义化的简单方法是:去掉CSS,看网站结构是否组织良好有序,是否仍然有良好的可读性. 你可以手动注释CSS代码,也可以使用we

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD)

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD) 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 41.多用派发队列,少用同步锁 42.多用GCD,少用performSelector系列方法 43.掌握GCD及操作队列的使用时机 44.通过Dispatch Group机制,根据系统资源状况来执行任务 45.使用dispatch_once来执行只需要运行一次的线程安全代码 46.不

为什么国人很难出高质量开源

FKP-REST是一套全栈javascript框架 为什么国人很难出高质量开源 作者:webkixi 乱侃 今天因为VueJS展开的讨论,话锋转转,就转到这个主题了.这个主题其实也一直是我想要了解的问题,毕竟是 这个FKPJS要走的路.怎么样才能做好开源. 这里先推荐一篇好文,<思考的八种境界>,文章不长,但却有些感悟,第一条就撞在胸口, <一.形成主见>,行文大概意思是:有自己的一套,即便是很浅薄. 是的,即便浅薄,那也是心血所成,正如我正在做的FKPJS,虽然浅薄,但却花费了我

编写高质量代码改善C#程序的157个建议——建议85:Task中的异常处理

建议85:Task中的异常处理 在任何时候,异常处理都是非常重要的一个环节.多线程与并行编程中尤其是这样.如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出.处理那些不是主线程(如果是窗体程序,那就是UI主线程)产生的异常,最终的办法都是将其包装到主线程上. 在任务并行库中,如果对任务运行Wait.WaitAny.WaitAll等方法,或者求Result属性,都能捕获到AggregateException异常.可以将AggregateException异常看做是任务并行库编程中最上层的异

编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理

原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 文章宗旨:Talk is cheap show me the code. 大成若缺,其用不弊.大盈若冲,其用不穷.  <道德经-老子>最完满的东西,好似有残缺一样,但它的作用永远不会衰竭:最充盈的东西,好似是空虚一样,但是它的作用是不会穷尽的 Written In The Font 摘要: 异常处理概述 学习内容: 建议110: 提倡异常封装 建议111: 采用异常链传递异常 建议

前端进阶之路:如何高质量完成产品需求开发

写在前面 作为一个互联网前端老鸟,这么些年下来,做过的项目也不少.从最初的我的QQ中心.QQ圈子,到后面的QQ群项目.腾讯课堂.从几个人的项目,到近百号人的项目都经历过. 这期间,实现了很多的产品需求,也积累了一些经验.这里稍作总结,希望能给新入行的前端小伙伴们一些参考. 做好需求的关键点 要说如何做好一个需求,展开来讲,可以写好几篇文章,这里只挑重点来讲. 最基本的,就是把握好3W:what.when.how. what:做什么? when:完成时间? how:如何完成? 需求场景假设 为了下

编码规范之编写灵活、稳定、高质量的 HTML 和 CSS 代码的规范

不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的. 因此,编写灵活.稳定.高质量的 HTML 和 CSS 代码,是每一个技术人员的基本操守. HTML ************************************************************************ 语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 嵌套元素应当缩进一次(即两个空格). 对于属性的定义,确保全部使用双引号,绝不要使用单

编写高质量代码改善C#程序的157个建议——建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间

建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间 在我们身边的世界中,对象是什么?对象就是事物,俗称“东西”.那么,什么东西算得上是一个对象呢?对象有属性.有行为.以动物为例,比如猫(Cat).Cat可以有Name,这就是属性:Cat有一个恶习ScratchSofa(挠沙发),这就是行为.我们把这些属性和行为结合起来,就称为一个类型: class Cat { public string Name { get; set; } public void ScratchSofa()