Korzystanie z modułu Underscore w Node.js.


147

Dowiedziałem się o node.js i modułach i nie mogę sprawić, by biblioteka Underscore działała poprawnie ... wygląda na to, że gdy po raz pierwszy używam funkcji z Underscore, nadpisuje ona obiekt _ wynikiem moje wywołanie funkcji. Czy ktoś wie, co się dzieje? Na przykład, oto sesja z pliku 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

Kiedy sam tworzę pliki Javascript i importuję je, wydaje się, że działają poprawnie. Może jest coś specjalnego w bibliotece Underscore?

Odpowiedzi:


169

Węzeł REPL używa zmiennej podkreślenia do przechowywania wyniku ostatniej operacji, więc powoduje to konflikt z użyciem tej samej zmiennej przez bibliotekę Underscore. Spróbuj czegoś takiego:

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
Dziękuję Ci. To było proste.
Geoff,

6
Uderzam głową w klawiaturę od 30 minut, dzięki za to!
rossipedia

3
Właśnie dlatego SO jest niesamowity. Takie świetne odpowiedzi pozwalają zaoszczędzić wiele godzin „machania głową”. Thankyou @Mike
Brian Tracy


194

Od dzisiaj (30 kwietnia 2012 r.) Możesz normalnie używać podkreślenia w kodzie Node.js. Poprzednie komentarze wskazują, że interfejs REPL (tryb wiersza poleceń węzła) używa znaku „_” do przechowywania ostatniego wyniku, ALE możesz go używać na swoich plikach kodu i będzie działać bez problemu, wykonując standard:

var _ = require('underscore');

Miłego kodowania!


7
Uwaga, to nie zadziała, jeśli spróbujesz zglobalizować podkreślenie: gist.github.com/3220108
Lance Pollard

9
Ktoś mi kiedyś powiedział, że Globals źle radzą sobie ze wszystkimi językami programowania. Nie widzę problemu z koniecznością określenia var _ = require ('underscore') w modułach, które tego wymagają. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez

Z jaką wersją węzła odpowiada 30 kwietnia 2012 r.?
poseid

Kwiecień 2012 odpowiada 0,6.
Erick Ruiz de Chavez

Erick, to problem, jeśli próbujesz ponownie użyć kodu po stronie klienta również po stronie serwera.
Brandon


13

Nazwa _używana przez node.jsREPL do przechowywania poprzedniego wejścia. Wybierz inną nazwę.


10
__ podwójne podkreślenie? :)
Amc_rtty

3
podwójne podkreślenie jest lepsze niż _nie czuję :)
Kaushik Thirthappa

-3

Uwaga: Poniższe działa tylko dla następnego wiersza kodu i tylko z powodu zbiegów okoliczności.

Z Lodash,

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

Nie, var _ = require('lodash')ponieważ Lodash w tajemniczy sposób ustawia tę wartość globalnie, gdy jest to wymagane.


Nie, to nie zadziała z lodash ani z niczym innym. Działa to w twoim przykładzie, ponieważ, jak wspomniano powyżej, node ustawia wynik ostatniej instrukcji na _. Wynikiem twojego ostatniego oświadczenia była lodash lib. Tak _.isArray([])będzie działać na następnej linii , ale nigdy więcej.
Mark Kahn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.