2014-09-22 79 views
3

我正在用noodcook book第二版學習nodejs。如何使用browserify模塊爲瀏覽器調整xml2js節點模塊?

在第三章中,從客戶端發送串行數據到服務器,

我面臨的障礙。

下面

是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的格式打交道時,上面的代碼並沒有特別的工作。我認爲問題是browserify模塊。

我通過https://www.npmjs.org/package/browserify瞭解了browserify,但我很難理解和正確使用模塊。

你能讓我知道是什麼問題?

謝謝!

回答

4

,我發現自己的答案。

的主要問題是browserify node_modules/xml2js -s xml2js -o xml2js.js

這是行不通的。

所以我們需要適應新的browserify模塊。

首先,創建了包含以下代碼的任何javascript文件(xml2jsM.js)。 '嚴格使用';

var _ = require('xml2js'); 

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

module.exports = logUnderscoreVersion; 

然後安裝下劃線模塊。 (npm安裝下劃線)

然後打包文件。 (browserify xml2jsM.js>包。JS)

,然後包括add_profile_index.html

(您可以參考上http://lincolnloop.com/blog/untangle-your-javascript-browserify/這些步驟)

如果您有任何問題,讓我知道。

謝謝〜

+0

上述方法處理爲瀏覽器,但我使用systemjs,我無法弄清楚如何解決的依賴(雖然寄託都在那裏在捆綁的文件)。現在我已經通過全局訪問在窗口對象中添加了xml2js。如果有人建議我如何在systemjs中使用它,那將會很棒。 – 2017-02-23 09:42:32

-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);