Verwenden des Unterstrichmoduls mit Node.js.

147

Ich habe etwas über node.js und Module gelernt und kann anscheinend nicht dazu führen, dass die Underscore-Bibliothek ordnungsgemäß funktioniert. Wenn ich zum ersten Mal eine Funktion von Underscore verwende, überschreibt sie das _ -Objekt mit dem Ergebnis von mein Funktionsaufruf. Weiß jemand was los ist? Hier ist zum Beispiel eine Sitzung aus der REPL von 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

Wenn ich selbst Javascript-Dateien erstelle und importiere, scheinen sie ordnungsgemäß zu funktionieren. Vielleicht hat die Underscore-Bibliothek etwas Besonderes?

Geoff
quelle

Antworten:

169

Der Knoten REPL verwendet die Unterstrichvariable, um das Ergebnis der letzten Operation zu speichern, sodass ein Konflikt mit der Verwendung derselben Variablen durch die Unterstrichbibliothek besteht. Versuchen Sie so etwas:

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
quelle
2
Danke dir. Das war unkompliziert.
Geoff
6
Ich habe jetzt 30 Minuten lang meinen Kopf gegen meine Tastatur geschlagen, danke dafür!
Wikipedia
3
Deshalb ist SO großartig. Tolle Antworten wie diese sparen Stunden des "Head Banging". Vielen Dank @Mike
Brian Tracy
Knoten v6 unterstützt die Zuweisung_ in der REPL.
John-David Dalton
194

Ab heute (30. April 2012) können Sie Underscore wie gewohnt für Ihren Node.js-Code verwenden. Frühere Kommentare weisen zu Recht darauf hin, dass die REPL-Schnittstelle (Node's Command Line Mode) das "_" verwendet, um das letzte Ergebnis zu speichern, ABER Sie können es in Ihren Codedateien verwenden und es funktioniert problemlos, indem Sie den Standard ausführen:

var _ = require('underscore');

Viel Spaß beim Codieren!

Erick Ruiz de Chavez
quelle
7
Beachten Sie, dass dies nicht funktioniert, wenn Sie versuchen, den Unterstrich zu globalisieren: gist.github.com/3220108
Lance Pollard
9
Jemand hat mir einmal gesagt, dass Globals in allen Entwicklungssprachen schlecht sind. Ich sehe kein Problem darin, var _ = require ('underscore') für die Module anzugeben, die es benötigen. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez
Mit welcher Knotenversion korrespondiert der 30. April 2012?
Poseid
April 2012 entspricht 0,6.
Erick Ruiz de Chavez
Erick, es ist ein Problem, wenn Sie versuchen, clientseitigen Code auch auf der Serverseite wiederzuverwenden.
Brandon
13

Der Name, _der von der node.jsREPL verwendet wird, um die vorherige Eingabe zu speichern. Wählen Sie einen anderen Namen.

dkiyatkin
quelle
10
__ doppelter Unterstrich? :)
Amc_rtty
3
Doppelter Unterstrich ist besser als _und ich fühle mich :)
Kaushik Thirthappa
-3

Hinweis: Das Folgende funktioniert nur für die nächste Codezeile und nur aufgrund eines Zufalls.

Mit Lodash,

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

Nein, var _ = require('lodash')da Lodash diesen Wert bei Bedarf auf mysteriöse Weise global festlegt.

Code Whisperer
quelle
Nein, das funktioniert nicht mit lodash oder irgendetwas anderem. In Ihrem Beispiel funktioniert dies, da der Knoten, wie oben angegeben, das Ergebnis der letzten Anweisung auf setzt _. Das Ergebnis Ihrer letzten Aussage war die lodash lib. Also _.isArray([])wird in der nächsten Zeile gearbeitet , aber nie wieder.
Mark Kahn