2013-01-26 2 views
0

저는 NodeJS를 처음 사용했기 때문에 비동기 적으로 동시에 IO 작업을 수행하여 전체 요청 시간이 가장 느린 시간에 더 가깝도록 성능 이점을 얻었습니다. IO 작업의 합계가 아니라 모든 IO 작업의 합계입니다.NodeJS는 동시성/비동기식으로 뷰를 생성합니다.

그러나 모든 콜백은 약간 지저분하며 가능하다면 코드를 DRY로 만들기 위해 최선을 다하고 싶습니다.

정상적인 페이지 요청에 대해 머리글 + 본문 + 바닥 글보기를로드하지만 AJAX 요청에 대한 본문 만로드하는 간단한 '팜플렛'유형 5 웹 사이트가 있습니다 (get 매개 변수 'ajaxify'사용) - 결과 컨텐츠는 클라이언트의 페이지 본문에 삽입됩니다.

동시/비동기 IO 작업을 처리 할 때 코드 디자인을 관리하고 모든 IO 작업이 완료되면 응답을 작성하는 방법에 대한 몇 가지 팁을 찾고 있습니다.

이는 NodeJS 모듈 내 첫 번째 시도한다 -

일반적으로 사용되는이 유형의 문제에 대한 디자인 패턴의 모든 유형이 있습니까 (커피 스크립트로 작성된 나는 컴파일 된 자바 스크립트뿐만 아니라 공급 한)?

os     = require 'os' 
url     = require 'url' 
html_minifier = require 'html-minifier' 

render_views = (req, res, body_view, code = 200) -> 

    complete = (arg) -> 

    response = arg.response 
    code  = arg.code 

    if query.hasOwnProperty 'ajaxify' 
     res.send html_minifier.minify response.body, 
     collapseWhitespace: true 
     removeComments: true, 
     code 
    else 
     if response.header != '' and response.body != '' and response.footer != '' 
     res.send html_minifier.minify response.header + response.body + response.footer, 
      collapseWhitespace: true 
      removeComments: true, 
      code 

    query = url.parse(req.url, true).query 

    response = 
    header: '' 
    body: '' 
    footer: '' 

    if query.hasOwnProperty 'ajaxify' 

    code = 200 
    res.render body_view, {}, (err, html) -> 
     response.body = html 
     complete 
     response: response 
     code:  code 

    else 
    res.render body_view, {}, (err, html) -> 
     response.body = html 
     complete 
     response: response 
     code:  code 

    res.render 'view_header', {}, (err, html) -> 
     response.header = html 
     complete 
     response: response 
     code:  code 

    res.render 'view_footer', {}, (err, html) -> 
     response.footer = html 
     complete 
     response: response 
     code:  code 


exports.index = (req, res) -> 
    render_views(req, res, 'view_index') 

exports.services = (req, res) -> 
    render_views(req, res, 'view_services') 

exports.about = (req, res) -> 
    render_views(req, res, 'view_about') 

exports.blog = (req, res) -> 
    render_views(req, res, 'view_blog') 

exports.contact = (req, res) -> 
    render_views(req, res, 'view_contact') 

exports.error = (req, res) -> 
    render_views(req, res, 'view_error', '404') 

그리고 정기적으로 컴파일 된 자바 스크립트 : 당신은 당신의 코드를 조금 단순화 할 수

// Generated by CoffeeScript 1.4.0 
(function() { 
    var html_minifier, os, render_views, url; 

    os = require('os'); 

    url = require('url'); 

    html_minifier = require('html-minifier'); 

    render_views = function(req, res, body_view, code) { 
    var complete, query, response; 
    if (code == null) { 
     code = 200; 
    } 
    complete = function(arg) { 
     var response; 
     response = arg.response; 
     code = arg.code; 
     if (query.hasOwnProperty('ajaxify')) { 
     return res.send(html_minifier.minify(response.body, { 
      collapseWhitespace: true, 
      removeComments: true 
     }, code)); 
     } else { 
     if (response.header !== '' && response.body !== '' && response.footer !== '') { 
      return res.send(html_minifier.minify(response.header + response.body + response.footer, { 
      collapseWhitespace: true, 
      removeComments: true 
      }, code)); 
     } 
     } 
    }; 
    query = url.parse(req.url, true).query; 
    response = { 
     header: '', 
     body: '', 
     footer: '' 
    }; 
    if (query.hasOwnProperty('ajaxify')) { 
     code = 200; 
     return res.render(body_view, {}, function(err, html) { 
     response.body = html; 
     return complete({ 
      response: response, 
      code: code 
     }); 
     }); 
    } else { 
     res.render(body_view, {}, function(err, html) { 
     response.body = html; 
     return complete({ 
      response: response, 
      code: code 
     }); 
     }); 
     res.render('view_header', {}, function(err, html) { 
     response.header = html; 
     return complete({ 
      response: response, 
      code: code 
     }); 
     }); 
     return res.render('view_footer', {}, function(err, html) { 
     response.footer = html; 
     return complete({ 
      response: response, 
      code: code 
     }); 
     }); 
    } 
    }; 

    exports.index = function(req, res) { 
    return render_views(req, res, 'view_index'); 
    }; 

    exports.services = function(req, res) { 
    return render_views(req, res, 'view_services'); 
    }; 

    exports.about = function(req, res) { 
    return render_views(req, res, 'view_about'); 
    }; 

    exports.blog = function(req, res) { 
    return render_views(req, res, 'view_blog'); 
    }; 

    exports.contact = function(req, res) { 
    return render_views(req, res, 'view_contact'); 
    }; 

    exports.error = function(req, res) { 
    return render_views(req, res, 'view_error', '404'); 
    }; 

}).call(this); 

답변

2

req.xhr를 사용하여 (당신이 명시 적 사용하는 가정) (또는 검사에 의해 X-요청-으로 헤더) . 만약 당신이 좋아하면 당신이보기에 바로 논리를 움직일 수

query.hasOwnProperty('ajaxify') 

또는

req.xhr 

로 모든 쿼리 문자열 물건을 놓을 수 있습니다 이런 식으로 ...

교체 ... 단지 if (! req.xhr)를 머리말/꼬리말 주위에 넣으면 모든 것이 끝납니다. 이 경우 모든 render_views 메소드는 res.render를 호출하고 html 축소 (훨씬 간단하게 만들기)를 수행합니다.