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.