Usando o módulo Underscore com Node.js

147

Estou aprendendo sobre o node.js e os módulos, e parece que a biblioteca do Underscore não funciona corretamente ... parece que a primeira vez que uso uma função do Underscore, substitui o objeto _ pelo resultado de minha chamada de função. Alguém sabe o que está acontecendo? Por exemplo, aqui está uma sessão do 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 eu mesmo faço arquivos Javascript e os importo, eles parecem estar funcionando corretamente. Talvez haja algo especial na biblioteca Underscore?

Geoff
fonte

Respostas:

169

O Nó REPL usa a variável sublinhado para conter o resultado da última operação, portanto entra em conflito com o uso da mesma variável pela biblioteca Underscore. Tente algo como isto:

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
Mike Scott
fonte
2
Obrigado. Isso foi direto.
Geoff
6
Estou batendo a cabeça no meu teclado há 30 minutos, obrigado por isso!
Rossipedia 25/10
3
É por isso que SO é incrível. Ótimas respostas como essa economizam horas de "bater a cabeça". Obrigado, Mike @
Brian Tracy
O nó v6 suporta a atribuição_ no REPL.
John-David Dalton
194

A partir de hoje (30 de abril de 2012), você pode usar Underscore normalmente no seu código Node.js. Comentários anteriores apontam corretamente que a interface REPL (modo de linha de comando do Node) usa o "_" para conter o último resultado, MAS você é livre para usá-lo em seus arquivos de código e funcionará sem problemas seguindo o padrão:

var _ = require('underscore');

Feliz codificação!

Erick Ruiz de Chavez
fonte
7
Observe que isso não funciona se você tentar globalizar o sublinhado: gist.github.com/3220108
Lance Pollard
9
Alguém uma vez me disse que o Globals é ruim em todas as linguagens de desenvolvimento. Não vejo um problema ao especificar var _ = require ('underscore') nos módulos que precisam dele. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez
Qual versão do Nó corresponde a 30 de abril de 2012?
poseid 14/05
Abril de 2012 corresponde a 0,6.
Erick Ruiz de Chavez
Erick, é um problema se você estiver tentando reutilizar o código do lado do cliente no servidor também.
Brandon
13

O nome _usado pelo node.jsREPL para armazenar a entrada anterior. Escolha outro nome.

dkiyatkin
fonte
10
__ sublinhado duplo? :)
Amc_rtty
3
sublinhado duplo é melhor do que _und eu sinto :)
Kaushik Thirthappa
-3

Nota: O seguinte funciona apenas para a próxima linha de código e apenas devido a uma coincidência.

Com o Lodash,

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

Não, var _ = require('lodash')pois a Lodash misteriosamente define esse valor globalmente quando necessário.

Code Whisperer
fonte
Não, isso não funcionará com lodash ou qualquer outra coisa. Isso funciona no seu exemplo porque, como mencionado acima, o nó define o resultado da última instrução para _. O resultado de sua última declaração foi a lib lodash. Então _.isArray([]), funcionará na próxima linha , mas nunca mais.
27460 Mark Kahn #