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 =  ''+
                ''+
                ''+
                ''+
                ''+
                ''+
                '
'+ ''+ ''+ '
'+ ''+ ''; 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()

你可能感兴趣的:(node.js初体验)