node의 막힘과 비막힘

3434 단어
var exec = require('child_process').exec;
function start() {
    console.log('do start');
    // function sleep(seconds) {
    //     var startTime = new Date().getTime();
    //     while(new Date().getTime() <  startTime + seconds);
    // }
    // sleep(10000);
    var content ="empty";
    exec('find',function (error,stdout,stderr) {
        content = stdout;
    })
    return content;
}
function upload() {
    console.log('do upload');
    return 'upload';
}
exports.start = start;
exports.upload = upload;


도입 child_프로세스 모듈의exec 방법은 하위 프로세스를 열어 다른 프로그램을 실행할 수 있습니다
여기에서 비차단 작업을 하기 위해exec()는 리셋 함수를 호출했습니다. 이것은 exec와spawn 방법의 차이를 잘 설명하는 링크입니다. 상기 코드에서 코드는 동기적으로 실행되고 exec()를 호출한 후node를 의미합니다.js는 return content를 즉시 실행합니다. 이 때 content는 "empty"입니다. exec () 에 전달된 리셋 함수가 실행되지 않았습니다. exec () 작업이 비동기적이기 때문입니다
  • node.js는 비차단 조작으로 요청 응답을 하는 정확한 실현 방안이 있습니다. 함수 전달입니다

  • 응용 프로그램은 각 층 간의 전달 값을 응용하는 방식(요청 처리 프로그램 -> 요청 루트 -> 서버)을 통해 요청 처리 프로그램이 되돌아오는 내용을 http 서버에 전달할 수 있다.다음에 우리는 다음과 같은 새로운 실현 방식을 채택한다. 상대적으로 내용을 서버에 전달하는 방식을 채택하고 우리는 이번에 서버가 내용을 전달하는 방식을 채택한다.response 대상 (서버의 리셋 함수 onRequest () 에서 가져오기) 이 요청 루트를 통해 요청 처리 프로그램에 전달된다는 것입니다.그 다음에 처리 프로그램은 이 대상의 함수를 채택하여 요청에 상응하도록 할 수 있다 sever.js
    var http = require('http');
    var url =require('url');
    function start(route,handle) {
        function onRequest(request,response) {
            var pathname = url.parse(request.url).pathname;
            if (pathname === '/favicon.ico') {
    
            }else{
                response.writeHead(200,{'Content-Type':'text/plain'});
                route(handle,pathname,response);
                // var content = route(handle,pathname,response);
                // response.write(content);
                // response.end();    
            }
    
        }
        http.createServer(onRequest).listen(80);
        console.log('server running at 80');
    }
    exports.start = start;
    
    
    route() , response route() , , onRequest() response , route() router.js
    
    function route(handle,pathname,response) {
        if (typeof handle[pathname] ==='function') {
            return handle[pathname](response);
        }else{
            console.log('no request'+pathname);
            response.writeHead(404,{"Content-Type":"text/plain"});
            response.write('404 NOT FOUND');
            response.end();
        }
    }
    exports.route = route;
    
    
    , response , 404 requestHandler.js
    var exec = require('child_process').exec;
    
    function start(response) {
        console.log('do start');
        exec('ipconfig',{encoding:"gbk",timeout:10000,maxBuffer:20000*1024},function (error,stdout,stderr) {
            response.writeHead(200,{"Content-Type":"text/plain;charset:utf-8"});
            response.write(stdout);
            response.end();
        })
    }
    function upload(response) {
        console.log('do upload');
        response.writeHead(200,{"Content-Type":"text/plain"});
        response.write('this command is upload');
        response.end();
    }
    exports.start = start;
    exports.upload = upload;
    
    

    위에서 엔코딩:'gbk'가 추가되지 않으면 브라우저 인코딩이 엉망입니다.node.js 기본 인코딩은utf-8입니다.만약encoding: "xxx"xxx가 식별되지 않으면 버퍼로 전환됩니다.

    좋은 웹페이지 즐겨찾기