Usando el módulo Underscore con Node.js


147

He estado aprendiendo sobre node.js y módulos, y parece que no puedo hacer que la biblioteca Underscore funcione correctamente ... parece que la primera vez que uso una función de Underscore, sobrescribe el objeto _ con el resultado de Mi llamada a la función. Alguien sabe lo que está pasando? Por ejemplo, aquí hay una sesión del nodo.js REPL:

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

Cuando hago archivos Javascript yo mismo y los importo, parece que funcionan correctamente. ¿Tal vez hay algo especial con la biblioteca Underscore?

Respuestas:


169

El Node REPL utiliza la variable de subrayado para contener el resultado de la última operación, por lo que entra en conflicto con el uso de la misma variable por parte de la biblioteca de subrayado. Intenta algo como esto:

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
Gracias. Eso fue sencillo.
Geoff

66
Llevo 30 minutos golpeándome la cabeza contra el teclado, ¡gracias por esto!
rossipedia

3
Es por eso que SO es increíble. Grandes respuestas como esta ahorran horas de "golpes en la cabeza". Gracias @Mike
Brian Tracy


194

A partir de hoy (30 de abril de 2012) puede usar el subrayado como de costumbre en su código Node.js. Los comentarios anteriores apuntan correctamente a que la interfaz REPL (modo de línea de comando del Nodo) usa la "_" para mantener el último resultado PERO en usted es libre de usarlo en sus archivos de código y funcionará sin problemas haciendo el estándar:

var _ = require('underscore');

¡Feliz codificación!


77
Tenga en cuenta que esto no funciona si intenta globalizar el guión bajo: gist.github.com/3220108
Lance Pollard

9
Alguien me dijo una vez que los Globals son malos en todos los lenguajes de desarrollo. No veo un problema al tener que especificar var _ = require ('subrayado') en los módulos que lo requieren. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez

¿Con qué versión de nodo corresponde el 30 de abril de 2012?
Poseid

Abril de 2012 corresponde a 0.6.
Erick Ruiz de Chavez

Erick, es un problema si también intentas reutilizar el código del lado del cliente en el lado del servidor.
Brandon



-3

Nota: Lo siguiente solo funciona para la siguiente línea de código, y solo debido a una coincidencia.

Con Lodash

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

No, var _ = require('lodash')ya que Lodash establece misteriosamente este valor a nivel mundial cuando es necesario.


No, esto no funcionará con lodash o cualquier otra cosa. Funciona en su ejemplo porque, como se indicó anteriormente, el nodo establece el resultado de la última instrucción en _. El resultado de su última declaración fue la lodash lib. Entonces _.isArray([])trabajará en la siguiente línea , pero nunca más.
Mark Kahn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.