NodeJS - 要求模块返回空数组

时间:2013-03-14 14:36:02

标签: node.js

编写最简单的模块,我们写入hello.js:

var hello = function(){
  console.log('hello');
};

exports = hello; \\ Doesn't work on Amazon EC2 Ubuntu Instance nor Windows Powershell

我运行Node并需要模块

var hello = require('./hello');
hello;
当我想要{}时,

返回一个空数组[Function]

我尝试用exports替换module.exports,但这不适用于我的Windows Powershell。它适用于我的Amazon EC2 Ubuntu实例,那么为什么exports不起作用? API有变化吗? Powershell可能会发生什么,这些都不起作用?

我知道Windows并不是最理想的开发环境,但我无法理解这样一个简单的事故。

2 个答案:

答案 0 :(得分:9)

修改

使用ES6导出更好一点

export const hello = function(){
  console.log('hello');
};

导入将类似于

import {hello} from './file';

原始回答

您需要使用module.exports

var hello = function(){
  console.log('hello');
};

module.exports = hello;

如果只输出一件事,我通常会在一行中完成所有操作

var hello = module.exports = function() {
  console.log('hello');
};

附加功能

如果您使用命名函数,如果代码中发生错误,您的堆栈跟踪看起来会更好。这是写它的方式

// use a named function               ↓
var hello = module.exports = function hello() {
  console.log("hello");
};

现在,它不会显示堆栈跟踪中函数名称的anonymous,而是显示hello。这使得查找错误变得更加容易。

我在任何地方使用这种模式,以便我可以轻松调试代码。这是另一个例子

// event listeners          ↓
mystream.on("end", function onEnd() {
  console.log("mystream ended");
};

// callbacks                              ↓
Pokemon.where({name: "Metapod"}, function pokemonWhere(err, result) {
  // do stuff
});

如果您想导出多个内容,可以直接使用exports,但必须提供key

// lib/foobar.js
exports.foo = function foo() {
  console.log("hello foo!");
};

exports.bar = function bar() {
  console.log("hello bar!");
};

现在使用该文件时

var foobar = require("./lib/foobar");

foobar.foo(); // hello foo!
foobar.bar(); // hello bar!

作为最后的奖励,我将向您展示如何通过导出单个对象重写foobar.js,但仍然可以获得相同的行为

// lib/foobar.js
module.exports = {
  foo: function foo() {
    console.log("hello foo!");
  },
  bar: function bar() {
    console.log("hello bar!");
  }
};

// works the same as before!

这允许您以最适合该特定模块的方式编写模块。耶!

答案 1 :(得分:6)

exports无效的原因是因为引用冲突。每个文件中的顶部变量为module,其属性为module.exports。加载模块时在后台创建新变量。这样的事情发生了:

var exports = module.exports;

显然exports是对module.exports的引用,但正在执行

exports = function(){};

强制exports变量指向功能对象 - 它不会更改module.exports。这就像在做:

var TEST = { foo: 1 };
var foo = TEST.foo;
foo = "bar";
console.log(TEST.foo);
// 1

通常的做法是:

module.exports = exports = function() { ... };

我不知道为什么它在Windows Powershell下不起作用。说实话,我甚至不确定那是什么。 :)你不能只使用本机命令提示符吗?