Your first Node.js module
cnnr.me
cnnr.me
Throwing errors in an asynchronous context can have messy results for trying to handle them. http://benno.id.au/blog/2011/08/08/nodejs-exceptions is a good explanation.
npm init: Prompts for basic/common package.json entries
npm install --save: Install a module and place into dependencies
npm install --save-dev: Install a module and place into dev dependencies
npm install --save-optional: Install a module and place into optional dependencies
http://blog.timoxley.com/post/22371787222/handy-new-options-...
http://nodejs.org/docs/v0.6.18/api/modules.html#modules_the_...
The return value of `require` is `module.exports`, which may be reassigned.
Initially, the global `exports` variable is set to the same value as `module.exports`. Writing `exports = module.exports = ...` ensures they have the same value as you would expect.
But where should they have the same value? I thought require returns just module.exports if it exists and ignores exports.
It's incredibly confusing and they should have just picked one way to export data, instead of three.
module.exports = exports = { hello: 'hello', world: 'world' };
exports.yetAnother = 'yet another exports key';
===
and this yield
require('./hoge') -> {
hello: 'hello',
world: 'world',
yetAnother: 'yet another exports key'
}
But, when hoge.js is=== hoge.js ===
module.exports = { hello: 'hello', world: 'world' };
exports.yetAnother = 'yet another exports key';
===
require('./hoge') -> // { hello: 'hello', world: 'world' }
or
=== hoge.js ===
exports = { hello: 'hello', world: 'world' };
exports.yetAnother = 'yet another exports key';
===
require('./hoge') -> // {}
But: to get all objects do I have to assign module.exports to exports (so change the order from your first example)?:
exports = module.exports = { hello: 'hello', world: 'world' };
To be honest, I'm not quite sure about commonJS require implementation of nodeJS. But as long as I'm understand,
1. Use `module.exports` if you want to assign exports by object literal
2. Use `exports.[key]` if you want to assign exports brick by brick.
3. Use `exports = module.exports = {...}` or `module.exports = exports` if you want to ensure both functionality; you can assign `exports.[key] after assign exports by object literal.
https://gist.github.com/2692091
This fixes part of the problem, but what happens when you reference './models/user.js' from the file 'auth.js' but then auth grows in size and you decide to divide it and put it in auth/facebook.js, auth/twitter.js, etc. -- well, now you are fucked.
This gives you the flexibility to transparently change the file into a folder + index.*, then break functionality up into pieces that live inside that folder.
`module` defaults to {
id: ...
exports: {}
parent:...
filename:...
loaded:...
exited:...
children:...
paths:...
}
Whatever module.exports is at the end of the module is passed to the require statement.Every file essentially has two lines at the top.
this = module.exports;
var exports = module.exports;
The first helps lazy developers by allowing exporting without explicitly saying so. Because of this, the following alone is a valid module that exports {foo:'bar'} foo = 'bar'; // can also be written as this.foo = 'bar';
And the second matches the CommonJS standard. So the following CommonJS module will work: exports.foo = 'bar';
If you assign module.exports at any time after using `this` or `exports`, module.exports will point to the new object, and anything on the original module.exports object wont be passed to the `require` call.