2014-09-22 2 views
3

noodcook book 2 판으로 nodejs를 배우고 있습니다. 클라이언트에서 서버로 직렬화 된 데이터 전송 3 장에서브라우저의 xml2js 노드 모듈을 적용하기 위해 browserify 모듈을 어떻게 사용할 수 있습니까?

,

나는 장애물에 직면했다. 아래

이 add_profile_server.js 파일

var http = require('http'); 
var fs = require('fs'); 
var path = require('path'); 
var profiles = require('./profiles'); 
var xml2js = require('xml2js'); 

var index = fs.readFileSync('add_profile_index.html'); 
var clientXml2js = fs.readFileSync('./xml2js.js'); 

var routes, mimes = { 
    js: "application/javascript", 
    json: "application/json", 
    xml: "application/xml" 
}; 

function output(content, format, rootNode) { 
    if (!format || format === 'json') { 
     return JSON.stringify(content); 
    } 
    if (format === 'xml') { 
     return (new xml2js.Builder({rootName: rootNode})).buildObject(content); 
    } 
} 



routes = routes = { 
    'profiles': function (format) { 
     return output(Object.keys(profiles), format); 
    }, 
    '/profile': function (format, basename) { 
     return output(profiles[basename], format, basename); 
    }, 
    'xml2js' : function(ext) { 
     if (ext === 'js') { return clientXml2js; } 
    } 
}; 

function updateProfiles(profile, type, cb) { 
    var name = Object.keys(profile).pop(); 
    profiles[name] = profile[name]; 
    cb(output(profiles[name], type, name)); 
} 

function addProfile(request, cb) { 
    var pD = ''; //post data 
    request 
    .on('data', function (chunk) { pD += chunk; }) 
    .on('end',function() { 
     var contentType = request.headers['content-type']; 
     if (contentType === 'application/json') { 
      updateProfiles(JSON.parse(pD), 'json', cb); 
     } 
     if (contentType === 'application/xml') { 
      xml2js.parseString(pD, { 
       explicitRoot: false, 
       explicitArray: false 
      }, function(err, obj) { 
       updateProfiles(obj, 'xml', cb); 
      }); 
     } 
    }); 
} 


http.createServer(function (request, response) { 
var dirname = path.dirname(request.url), 
    extname = path.extname(request.url), 
// Return the last portion of a path. (optional-extname: return only file name on mattached ext) 
    basename = path.basename(request.url, extname); 

console.log("URL: "+request.url); 
console.log("dirname:"+dirname); 
console.log("extname:"+extname); 
console.log("basename:"+basename); 
console.log(""); 


    extname = extname.replace('.', ''); //remove period 

    if (request.method === 'POST') { 
     addProfile(request, function(output) { 
      response.end(output); 
     }); 
    return; 
    } 
    response.setHeader("Content-Type", mimes[extname] ||'text/html'); 
// If the subroute exists in the routes object, we call the method stored at that namespace passing in basenameand extname 
    if (routes.hasOwnProperty(dirname)) { 
     response.end(routes[dirname](extname, basename)); 
     return; 
    } 
    if (routes.hasOwnProperty(basename)) { 
     response.end(routes[basename](extname)); 
     return; 
    } 
    response.end(index);  
}).listen(8080); 

이며, 아래의 서버를 시작하기 전에 add_profile_index.html 파일

<!DOCTYPE html> 
<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 

     <style> 
      #frm, #raw {display:block; float:left; width:210px} 
      #raw {height:150px; width:310px; margin-left:0.5em} 
      #add {display:block; float:left; margin-left:1.5em} 
      #add div {display:table-row} 
      #add label {float:left; width:5.5em} 
       div button {float:right} 
     </style> 
     <title> INDEX </title> 
    </head> 

    <body> 
     <form id="frm"> 
      Profile: <select id="profiles"> 
      <option> </option> 
      </select> 
      <br></br> 

      Format:<select id="formats"> 
      <option value="json"> JSON </option> 
      <option value="xml"> XML </option> 
      </select> 
      <br></br> 
      <div id="output"></div> 
     </form> 
     <textarea id="raw"></textarea> 

     <form id="add"> 
      <div><label>profile name</label><input name="profileName"> </input></div> 
      <div><label>name</label><input name="name"></input></div> 
      <div><label>irc</label><input name="irc"></input></div> 
      <div><label>twitter</label><input name="twitter"></input></div> 
      <div><label>github</label><input name="github"></input></div> 
      <div><label>location</label><input name="location"></input></div> 
      <div><label>description</label><input name="description"></input></div> 
      <div><button>Add</button></div> 
     </form> 

     <script src="xml2js.js"></script> 
    </body> 

    <script> 
     function load(done) { 
      $.get('http://localhost:8080/profiles', 

       function (profile_names) { 
        $.each(profile_names, function (i, pname) { 
         $('#profiles').append('<option>' + pname + '</option>'); 
        }); 
       done && done(); 
       }, 
      'json'); 
     } 
     load(); 
     $('#add').submit(function(e) { 
      var output, obj = {}, format = $('#formats').val(), profileName; 
      e.preventDefault(); 
      $.each($(this).serializeArray(), function(i, nameValPair) { 
       obj[nameValPair.name] = nameValPair.value; //form an object 
      }); 
      profileName = obj.profileName; 
      delete obj.profileName; 

      obj = {_: obj}; 
      obj[profileName] = obj._; 
      delete obj._; 

      output = (format === 'json') ? JSON.stringify(obj) : 
      (new xml2js.Builder({rootName: profileName})).buildObject(obj); 
      $.ajax({ 
        type: 'POST', 
        url: '/', data: output, 
        contentType: 'application/' + format, dataType: 'text', 
        success: function(response) { 
         $('#raw').val(response); 
         $('#profiles').html('<option></option>'); 
         load(function() { 
          $('#profiles').val(profileName); 
         }); 
        } 
      }); 
     }); 
    </script> 

</html> 

입니다, 우리는 아래에 입력

NPM -g 명령 할 필요가 browserify 설치

browserify node_modules/xml2js -s xml2js -o xml2js.js

나는 예제 코드 만

XML 형식을 처리 할 때 위의 코드는 특히 작동하지 않는 구축을위한 똑바로 책을 따라 생각합니다. 나는 문제가 모듈을 브라우저 화한다고 생각한다.

나는 브라우저를 이해하기 위해 https://www.npmjs.org/package/browserify을 거쳤지 만 제대로 이해하고 모듈을 올바르게 사용하는 것은 어렵습니다.

문제점이 무엇인지 알려 주실 수 있습니까 ???

감사합니다.

답변

4

내가 직접 답변을 발견했다.

가장 큰 문제였다 browserify node_modules/xml2js -s xml2js -o xml2js.js 그것은 작동하지 않는

.

그래서 새로운 browserify 모듈을 적용해야합니다.

먼저 아래 코드를 포함한 모든 자바 스크립트 파일 (xml2jsM.js)을 만들었습니다. '엄격한 사용';

var _ = require('xml2js'); 

var logUnderscoreVersion = function() { 
    console.log(_.VERSION); 
} 

module.exports = logUnderscoreVersion; 

그리고 나서 밑줄 모듈을 설치하십시오. (npm install underscore)

다음 번들 파일을 만듭니다. (browserify xml2jsM.js> 번들.JS)

다음은 add_profile_index.html

에 포함 (당신은 당신이 어떤 질문이 있으면 알려 주시기) http://lincolnloop.com/blog/untangle-your-javascript-browserify/

를 그 단계를 참조 할 수 있습니다.

+0

위의 방법은 브라우저 일 ~ 감사합니다하지만 난 systemjs를 사용하고 있는데 (모든게은 번들 파일에 존재하지만) 나는 의존성을 해결하는 방법을 알아낼 수 없습니다. 지금은 전역 적으로 액세스 할 수있는 window 객체에 xml2js를 추가했습니다. 누군가가 나에게 systemjs에서 그것을 사용하는 방법을 제안한다면 그것은 좋을 것이다. –

-2

여기에 몇 가지 예제를 잘 관리하여 http://opennodes.arecord.us/md/xml2js.md 예제가 도움이되는지 확인하십시오.

다음과 같이 시도해보십시오. 대신

(new xml2js.Builder({rootName: profileName})).buildObject(obj); 

시도의

는 :

var xml2js = require('xml2js'); 
var builder = new xml2js.Builder({rootName: profileName})); 
builder.buildObject(obj); 
관련 문제