Utilizzo del modulo Underscore con Node.js


147

Ho imparato a conoscere node.js e i moduli e non riesco a far funzionare correttamente la libreria Underscore ... sembra che la prima volta che utilizzo una funzione di Underscore, sovrascrive l'oggetto _ con il risultato di la mia chiamata di funzione. Qualcuno sa cosa sta succedendo? Ad esempio, ecco una sessione dal REPL node.js:

Admin-MacBook-Pro:test admin$ node
> require("./underscore-min")
{ [Function]
  _: [Circular],
  VERSION: '1.1.4',
  forEach: [Function],
  each: [Function],
  map: [Function],
  inject: [Function],
  (...more functions...)
  templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
  template: [Function] }
> _.max([1,2,3])
3
> _.max([4,5,6])
TypeError: Object 3 has no method 'max'
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:171:22)
    at Interface.emit (events.js:64:17)
    at Interface._onLine (readline.js:153:10)
    at Interface._line (readline.js:408:8)
    at Interface._ttyWrite (readline.js:585:14)
    at ReadStream.<anonymous> (readline.js:73:12)
    at ReadStream.emit (events.js:81:20)
    at ReadStream._emitKey (tty_posix.js:307:10)
    at ReadStream.onData (tty_posix.js:70:12)
> _
3

Quando creo personalmente i file Javascript e li importa, sembrano funzionare correttamente. Forse c'è qualcosa di speciale nella libreria Underscore?

Risposte:


169

Il REPL del nodo utilizza la variabile di sottolineatura per contenere il risultato dell'ultima operazione, quindi è in conflitto con l'uso della stessa libreria da parte della libreria Underscore. Prova qualcosa del genere:

Admin-MacBook-Pro:test admin$ node
> _und = require("./underscore-min")
{ [Function]
  _: [Circular],
  VERSION: '1.1.4',
  forEach: [Function],
  each: [Function],
  map: [Function],
  inject: [Function],
  (...more functions...)
  templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
  template: [Function] }
> _und.max([1,2,3])
3
> _und.max([4,5,6])
6

2
Grazie. È stato semplice.
Geoff,

6
Ho sbattuto la testa sulla tastiera per 30 minuti, grazie per questo!
rossipedia,

3
Questo è il motivo per cui SO è fantastico. Ottime risposte come questa risparmiano ore di "colpo alla testa". Grazie @ Mike
Brian Tracy


194

A partire da oggi (30 aprile 2012) puoi usare Underscore come al solito sul tuo codice Node.js. I commenti precedenti indicano che l'interfaccia REPL (modalità della riga di comando del nodo) usa "_" per contenere l'ultimo risultato MA su di te sei libero di usarlo sui tuoi file di codice e funzionerà senza problemi facendo lo standard:

var _ = require('underscore');

Buona programmazione!


7
Nota, questo non funziona se provi a globalizzare il carattere di sottolineatura: gist.github.com/3220108
Lance Pollard

9
Qualcuno una volta mi ha detto che i globali sono cattivi in ​​tutti i linguaggi di sviluppo. Non vedo alcun problema nel dover specificare var _ = require ('underscore') sui moduli che lo richiedono. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez

A quale versione del nodo corrisponde il 30 aprile 2012?
poseid

Aprile 2012 corrisponde a 0,6.
Erick Ruiz de Chavez,

Ehi, è un problema se stai cercando di riutilizzare il codice lato client anche sul lato server.
Brandon,


13

Il nome _utilizzato da node.jsREPL per contenere l'input precedente. Scegli un altro nome.


10
__ doppio trattino basso? :)
Amc_rtty,

3
il doppio trattino basso è meglio di _und mi sento :)
Kaushik Thirthappa

-3

Nota: quanto segue funziona solo per la riga di codice successiva e solo a causa di una coincidenza.

Con Lodash,

require('lodash');
_.isArray([]); // true

No var _ = require('lodash')poiché Lodash imposta misteriosamente questo valore a livello globale quando richiesto.


No, questo non funzionerà con lodash o altro. Funziona nel tuo esempio perché, come detto sopra, il nodo imposta il risultato dell'ultima istruzione su _. Il risultato della tua ultima affermazione è stato il lodash lib. Quindi _.isArray([])funzionerà sulla riga successiva , ma mai più.
Mark Kahn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.