所以我遵循最常见或推荐的方法将参数,模块或参数传递到其他模块,例如
var crypto = require('crypto');
var express = require('express');
var mongoose = require('mongoose');
var OAuth = require('oauth').OAuth2;
var app = express();
var config = require('./config.js')(app, crypto, mongoose, OAuth);
var models = require('./models')(mongoose); /*etc.*/
或者扩展app
例如
var express = require('express');
var app = express();
app.crypto = require('crypto');
app.mongoose = require('mongoose');
app.OAuth = require('oauth').OAuth2;
var config = require('./config.js')(app);
var models = require('./models')(app); /*etc.*/
或者扩展另一个对象并传递它会更安全。
var express = require('express');
var app = express();
var modules = {};
modules.crypto = require('crypto');
modules.mongoose = require('mongoose');
modules.OAuth = require('oauth').OAuth2;
var config = require('./config.js')(app, modules);
var models = require('./models')(app, modules); /*etc.*/
或者,是所有这些边缘情况,我应该采取其他方法吗?
每次我需要在我的应用中使用OAuth时,我都不想构建新的OAuth2实例,所以我当前在配置中创建了一个OAuth2实例,然后将配置传递到我的路由中;我是否仍然可以执行此操作并在每个模块中需要config.js
(例如routes.js
)?
答案 0 :(得分:0)
在您的情况下,您不会将crypto,mongoose和Oauth2视为参数。
你的代码应该是这样的:
// app.js
var express = require('express');
var app = express();
var config = require('./config.js')(app);
var models = require('./models')(app);
// config.js或models.js
var crypto = require('crypto');
var mongoose = require('mongoose');
var OAuth = require('oauth').OAuth2;
module.exports = function (app) {
// your code
}
所有require('mongoose')将共享同一个实例。如果你在app.js上调用mongoose.connect(),那么config.js和models.js也会被连接。
世界上有一些包可能会发送所需的模块作为参数,因为他们遇到了版本冲突的麻烦。但是只有当config.js和models.js是分离的模块(具有自己的package.json的模块)时才会发生这种情况。
关于你的3个例子: