node.js初体验

node.js初体验

前言

在学习webpack和vue的过程中经常会遇到关于node的知识,CommonJS规范等,所以对于前端来说学习node是非常有必要的,所以就有了这一篇node初体验的文章。

node安装

这个不多说,在node官网下载安装包直接安装就可以,node预设了npm,npm是一个用javascript写的包管理器,用于管理模块,想了解更多可以到https://www.npmjs.com/上去看,上面有非常多的模块,下面直接进入正文。

正文

用node直接撸了一个处理post请求,主要的知识点有函数式编程、路由、阻塞与非阻塞、回调、事件轮询、内部和外部模块等等。

index.js

var server = require('./server.js'),
    router = require('./router.js'),
    requestHandle = require("./requestHandlers.js"),
    handle = {};

handle['/'] = requestHandle.start;
handle['/upload'] = requestHandle.upload;
handle['/start'] = requestHandle.start;
server.start(router.route,handle);

server.js

function start(route,handle){

    var http = require("http");
    var url = require("url");
    // 请求
    function onRequest(request,respone)
    {
        var pathname=url.parse(request.url).pathname,
            postData="";
      
        request.setEncoding('utf8');
        request.addListener('data',function(postDatachunk)
        {
            postData += postDatachunk;
        });
        request.addListener('end',function()
        {
            route(pathname,handle,respone,postData);
        });
    }

    http.createServer(onRequest).listen(8888);
    console.log("server is start");
}
//导出函数
exports.start = start;

router.js

function route(pathname,handle,respone,postData)
{
    console.log('请求来自'+pathname);
    if(typeof(handle[pathname]) === 'function')
    {
        handle[pathname](respone,postData);
    }else{
        console.log("404 not found");
        respone.writeHead(200,{"Content-Type":"text/plain"});
        respone.write("404 not found!");
        respone.end();
    }
}

exports.route = route;

requestHandlers.js

var querystring = require('querystring');
function upload(respone,postData)
{
    console.log("这个是upload路由");
    respone.writeHead(200,{"Content-Type":"text/plain"});
    respone.write(querystring.parse(postData).txt);
    respone.end();
};
function start(respone)
{
    console.log("这个是start路由");
    var body =  '<html>'+
                '<head>'+
                '<meta charset="UTF-8">'+
                '<style>'+
                '#txt{float:left;width: 250px;height: 50px;border-right:none;border-top-left-radius: 3px;border-bottom-left:3px;}'+
                '#submit{float:left;border-sizing:border-box;width: 100px;height: 50px;background:skyblue;color: #fff;font-size: 18px;}'+
                '</style>'+
                '</head>'+
                '<body>'+
                '<form action="/upload" method="post">'+
                '<input type="text" id="txt" name="txt" />'+
                '<input type="submit" value="提交" id="submit" name="submit"/>'+
                '</form>'+
                '</body>'+
                '</html>';
    respone.writeHead(200,{"Content-Type":"text/html"});
    respone.write(body);
    respone.end();
};

exports.upload = upload;
exports.start = start;

总结

事件轮询(event loop)

JavaScript是一门单线程语言,也就是说如果遇到大量的任务或者耗时任务,线程就会被堵塞,需要等待其执行完毕,这就会造成页面假死等状态,为了解决这个问题,就需要有eventloop线程,简单来说我们可以新建一个eventloop线程负责主线程与其它进程的通信,这样在有大量任务和耗时任务时我们就交给eventloop线程去处理,一般是各种io操作,处理完毕后返回给主线程并执行预先设置的回调函数,这个模式我们就叫做非阻塞模式或者异步模式。
在这次node初体验中,我使用了child_process模块来实现了一个非阻塞操作
代码如下

var exex = require("child_process").exec;
function test(respone)
{
    exec("find /",{ timeout : 10000, maxBuffer : 200*1024},function(error,stdout,stderr)
    {
        respone.writeHead(200,{"Content-Type":"text/plain"});
        respone.write(stdout);
        respone.end();
    });
    // 阻塞操作
    // var time = new Date().getTime();
    // while(new Date().getTime()<time + 30000);
    // console.log("xxxxxxxxxxxxxxxxxxxxxxxxxx");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,653评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,321评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,833评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,472评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,306评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,274评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,658评论 3 385
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,335评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,638评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,697评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,454评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,311评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,699评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,986评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,254评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,647评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,847评论 2 335

推荐阅读更多精彩内容

  • 心好乱止不住哭
    Janennes阅读 144评论 0 0
  • 河畔草青 檐低柳风 颔首嫣然 宛若石壁惊鸿 谈笑风生 几丛窈窕魅影 寻寻觅觅 世界九重 三尺案台 笔墨总关情 自怔...
    燕无忧阅读 228评论 27 30
  • Android自定义view的实现方法回顾一下,我们一共学习了LayoutInflater的原理分析、视图的绘制流...
    丶完美阅读 222评论 0 0