2014-11-19 7 views
6

Ho uno scenario in cui voglio esportare i dati in CSV dal lato client. Avrò una casella di testo/area o qualsiasi altra cosa in cui l'utente può inserire i dati e quindi idealmente con un clic, un file CSV locale verrà aggiornato con tali dati.Node Modulo JS fs nel browser

Questo è facilmente realizzabile con NodeJS con interazione server e con i suoi moduli principali (in particolare il modulo fs), ma apparentemente non tanto da un browser.

Ho scoperto che alcuni moduli di nodo (ad esempio underscore), supportano il metodo RequireJS per far funzionare un particolare modulo nel browser. Così per sottolineatura ho fatto questo:

methods.js

define(['underscore'],function(_) { 

    var Methods = { 
     doSomething: function() { 

      var x = _.size({one: 1, two: 2, three: 3, xuz: 3}); 

      alert(x); 
     } 
    }; 

    return Methods; 
}); 

common.js

requirejs.config({ 
    baseURL: 'node_modules', 
    paths: { 
     underscore: 'underscore/underscore', 
    } 
}); 

require(['methods'], function(y){ 
    y.doSomething(); 
}); 

index.html

<script data-main="common" src="require.js"></script> 
<script> 
require(['common'], function() { 

    require(['methods.js']); 
}); 
</script> 

Quanto sopra funziona bene e mostrerà un avviso: 4.

Ma quando provo lo stesso con il modulo fs non funzionerà. Essa mostra questo errore:

Module name "util" has not been loaded yet for context: _. Use require([]) 

Per quanto posso capire, questo è perché fs richiede più moduli, uno dei quali è util.

Così ho proceduto ad aggiungere tutti questi moduli alla configurazione RequireJS. Ma ancora non ho avuto fortuna, quindi ho provato in modo specifico il modulo util in quanto questo non sembra richiedere il funzionamento di altri moduli.

e ora sono bloccato su questo errore: Uncaught ReferenceError: exports is not defined

Ho provato modularizzando questo modulo util incapsulando l'intero codice sorgente del modulo in questo:

define([], function() {}) 

Ma non ha funzionato neanche .. Ho anche provato a copiare il modello di underscore ma ancora senza fortuna.

Così mi chiedevo se qualcuno è riuscito a utilizzare util & fs moduli (o qualsiasi altro modulo NodeJS core) all'interno del browser con le librerie quali RequireJS o Browserify.

risposta

3

Proprio così, exports è JS specifico del nodo (utilizzato per rendere disponibile una parte del modulo all'esterno del modulo) e non è supportato dai browser Web.Anche se NodeJS è tecnicamente JS, esistono proprietà specifiche del client (come la proprietà window per i browser e exports per le app NodeJS) che non possono essere interscambiate.

Detto questo, here's un JS lato client risponde al problema CSV.

+1

Entrambe le risposte che ho ricevuto sono corrette, come ho scoperto anche dopo ulteriori ricerche. Quello che ho finito per fare il mio specifico scenario però (per tenere tutto lontano dai database e possibilmente lato client per l'utente) sta avendo due server NodeJS in esecuzione (uno per leggere e altro per scrivere). Questi ascoltano le modifiche al file CSV e scriveranno/leggeranno da/verso il file system attraverso il modulo fs NodeJS in questo modo. Questo approccio non è totalmente client-side, ma si evita l'interazione e la manutenzione del DB più tutto è in JS dal client al lato server. – zalow517

+0

Bello! Ho anche trovato informazioni su http://browserify.org/ dal momento della risposta. – FloatingRock

1

La soluzione migliore (e probabilmente solo una) è quella di utilizzare HTML5 FileSystem API. Non sono a conoscenza di altre funzionalità del browser che consentano di lavorare con i file sul computer client, ad eccezione forse della soluzione Flash e simile.

Sono un po 'confuso dal tuo tag browserify poiché non stai ovviamente utilizzando Browserify. Ciò risolverebbe il tuo problema con "le esportazioni non sono definite".