如何在不全局安装的情况下,在Node REPL中引入Node模块?

52
根据Node.js指南,强烈不建议全局安装任何Node模块。
我尝试了各种方法。我在我的主目录、我的Git文件夹(包含node_modules文件夹)以及实际的node_modules文件夹中执行了以下命令。
> var express=require('express');
undefined
> var express=require('node_modules/express');
Error: Cannot find module 'node_modules/express'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at repl:1:13
    at REPLServer.self.eval (repl.js:110:21)
    at repl.js:249:20
    at REPLServer.self.eval (repl.js:122:7)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
注意,在上面的例子中,我期望它们出现在我的git文件夹中(包括node_modules)。 我觉得这一行很有趣

> var express=require('express');

产生的

undefined

在主目录下,我仍然得到相同的“找不到模块”错误。


如果你在终端中运行 which express,你的输出是什么? - sbarow
3个回答

58

你的require语句运行正常。忽略undefined,那只是Node REPL。关于undefined的解释可以参考这里,我们也在下面的评论中提供了其他相关材料的链接。

你可以使用以下方式验证:

mkdir /tmp/test-repl
cd /tmp/test-repl
npm install express
node
> var express = require('express');
undefined
> express
//long object which is the express module gets printed

谢谢!但为什么它会打印 undefined 呢? - user2316667
2
这里是关于ECMA-262的讨论:JavaScript中的赋值和var关键字 - dc5
未定义是变量赋值的结果,这并没有什么有趣的地方,它只是工作原理。如果你仅键入require(''),你将获得该值。 - Sprague
我在REPL中获取了上述异常,但这仅适用于除node.js附带的模块之外的所有模块。我的模块是本地安装的,并且从交给node可执行文件的脚本中,对这些模块使用“require”是有效的。 - Joe Lapp
我解决了我的问题。在我使用的版本v5.2.0 REPL中,require()出现了故障。https://github.com/nodejs/node/issues/4208 - Joe Lapp
还没有深入研究原因,但在需要 lodash/underscore 时要小心,因为执行 var _ = require('lodash'); 仍然会是未定义的,但将其分配给除下划线之外的任何其他变量,例如 var foobar = require('lodash');,将可以工作(至少对我来说是这样)。 - DrunkenBeetle

5

根据终端/ shell 的不同,它可能要求您指定当前目录。我目前正在使用gitbash。

 _u = require('./node_modules/underscore/underscore');

当我执行此操作时,对象将被返回。

node repl require example

我很好奇这是否适用于其他人,对我有效。


4

undefined 打印出来是浏览器控制台和 Node REPL 的正常行为。

尝试输入:express.(按 tab 键) - 你应该会得到类似下面的输出:

> var express = require('express');
undefined
> express.
express.__defineGetter__      express.__defineSetter__      express.__lookupGetter__      express.__lookupSetter__      express.constructor           express.hasOwnProperty
express.isPrototypeOf         express.propertyIsEnumerable  express.toLocaleString        express.toString              express.valueOf               

express.apply                 express.arguments             express.bind                  express.call                  express.caller                express.constructor
express.length                express.name                  express.toString              

express.Route                 express.Router                express.application           express.arguments             express.basicAuth             express.bodyParser
express.caller                express.compress              express.cookieParser          express.cookieSession         express.createServer          express.csrf
express.directory             express.errorHandler          express.favicon               express.json                  express.length                express.limit
express.logger                express.methodOverride        express.mime                  express.multipart             express.name                  express.prototype
express.query                 express.request               express.response              express.responseTime          express.session               express.static
express.staticCache           express.timeout               express.urlencoded            express.version               express.vhost  

我感激它。 我尝试了express(按了tab键),但得到了3个点。但是'express'会产生一长串的结果。 - user2316667
有趣 - 你使用的是哪个版本的Node和操作系统? - dc5
也许这会有所帮助:Node JS REPL,Sockets和Telnet - Tab Completion,Arrow Keys等。在repl中工作时,拥有Tab Completion功能非常方便。 - dc5
Bash自动补全功能无法100%正常工作 - dc5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接