未加星标

NodeJS - Requiring module returns empty array

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二03 | 时间 2019 | 作者 红领巾 ] 0人收藏点击收藏

Writing the simplest module we could, we write into hello.js:

var hello = function(){ console.log('hello'); }; exports = hello; \\ Doesn't work on Amazon EC2 Ubuntu Instance nor windows Powershell

I run Node and require the module

var hello = require('./hello'); hello; and an empty array {} gets returned when I'm supposed to get [Function] .

I tried replacing exports with module.exports , but this doesn't work on my Windows Powershell. It does work on my Amazon EC2 Ubuntu Instance, so why doesn't exports work? Has the API changed? And what could possibly be happening with Powershell that neither of these work?

I know Windows isn't the most desirable development environment, but I can't get my head around such a simple mishap.

Problem courtesy of: ergo

Solution

The reason exports is not working is because of the reference conflict. The top variable in each file is module which has a property module.exports . When the module is loaded new variable is created in the background. Something like this happens:

var exports = module.exports;

Obviously exports is a reference to module.exports , but doing

exports = function(){};

forces exports variable to point at function object - it does not change module.exports . It's like doing:

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

Common practice is to do:

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

I have no idea why it doesn't work under Windows Powershell. To be honest I'm not even sure what that is. :) Can't you just use native command prompt?

Solution courtesy of: freakish

Discussion EDIT

exporting with ES6 is a little nicer

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

importing will look like

import {hello} from './file'; Original answer

You'll want to use module.exports

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

If just exporting one thing, I'll usually do it all in one line

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

If you use a named function , in the event an error occurs in your code, your stack trace will look a lot nicer. Here's the way I would write it

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

Now instead of showing anonymous for the function name in the stack trace, it will show you hello . This makes finding bugs so much easier.

I use this pattern everywhere so that I can debug code easily. Here's another example

// event listeners ↓ mystream.on("end", function onEnd() { console.log("mystream ended"); }; // callbacks ↓ Pokemon.where({name: "Metapod"}, function pokemonWhere(err, result) { // do stuff });

If you want to export multiple things , you can use exports directly, but you must provide a key

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

Now when you use that file

var foobar = require("./lib/foobar"); foobar.foo(); // hello foo! foobar.bar(); // hello bar!

As a final bonus, I'll show you how you can rewrite that foobar.js by exporting a single object but still getting the same behavior

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

This allows you to write modules in whichever way is best suited for that particular module . Yay!

Discussion courtesy of: naomik

This recipe can be found in it's original form on Stack Over Flow .

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

代码区博客精选文章
分页:12
转载请注明
本文标题:NodeJS - Requiring module returns empty array
本站链接:https://www.codesec.net/view/627952.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(23)