我想确保每次启动express.js应用程序时,都会对mongodb实例用户集合进行查询,以确保superadmin帐户存在。但是,express.js应用程序的设置阶段中的所有内容都是同步的。
我的一些想法是:
拥有一个注册模块的系统。每个模块都可以加载require并具有init
方法,可以使用传递回调的async
模块each
方法调用该方法。一旦模块上的所有init方法都完成执行,回调函数就会运行app.listen(process.env.PORT)
。
编写一个安装脚本,该脚本位于在命令行执行的express.js应用程序之外。此脚本使用mongoose连接到mongodb数据库,进行一些查询并终止。它可以添加到heroku.sh文件中,以确保每次启动express.js应用程序时它都会运行。
使用waitfor在express.js设置阶段同步运行数据库查询?这将使想法和代码保持简洁明了,但使用Fibers只是为了完成这一任务似乎有些过分。
答案 0 :(得分:1)
您不需要同步执行数据库查找。只有在您确认用户存在后,才能在数据库请求的回调中启动快速服务器。这是一个伪示例:
mongoclient.open(function (err, mongoclient) {
if (err) throw err; // or otherwise handle it
var db = client.db("dbname");
var findAdminUserJSON = {
// whatever your lookup criteria
};
db.collection("user").findOne(findAdminUserJSON, function(err, adminUserData){
if (err) throw err; // or otherwise handle it
if(adminUserData){
// start express server
} else {
// however you want to handle the case of no admin user
}
});
});
答案 1 :(得分:0)
我刚刚将init函数隔离到一个单独的文件中。它只在这里检查管理员用户的数据库,但将来,我可以注册通过app
和db
对象的模块,我将使用async.each
异步加载模块和在每个上运行init
方法以启动系统。一旦它们全部注册,就在快递服务器上运行init
。
server.js:
'use strict';
// Set the 'NODE_ENV' variable
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
process.env.PORT = process.env.PORT || 3000;
// Apparently __dirname doesn't work on Heroku
// @link http://stackoverflow.com/questions/17212624/deploy-nodejs-on-heroku-fails-serving-static-files-located-in-subfolders
process.env.PWD = process.cwd();
// Load the module dependencies
var mongoose = require('./server/config/mongoose'),
express = require('./server/config/express'),
init = require('./server/config/init');
// Create a new Mongoose connection instance
var db = mongoose();
// Create a new Express application instance
var app = express(db);
// Run the init this way in future refactor modules into separate folders.
init(app, db)
.then(function initialized() {
// Use the Express application instance to listen to the '3000' port
app.listen(process.env.PORT);
// Log the server status to the console
console.log('Server running at http://localhost:' + process.env.PORT + '/');
});
// Use the module.exports property to expose our Express application instance for external ussage
module.exports = app;
服务器/配置/ init.js:
'use strict';
var config = require('./config');
module.exports = function(app, db) {
return new Promise(function(resolve) {
var User = db.model('User');
User.findOne({ email: config.adminAccountEmail}, function(err, user) {
if (err) throw err;
if (!user) {
var newAdmin = new User({
email: config.adminAccountEmail,
password: config.adminAccountPassword,
roles: ['administrator', 'authenticated', 'anonymous']
});
newAdmin.save(function(err) {
if (err) throw err;
resolve();
})
} else {
resolve();
}
})
})
};
服务器/配置/ production.js:
'use strict';
/**
* Set the 'production' environment configuration object
* @link http://docs.mongolab.com/migrating/
*/
module.exports = {
db: process.env.MONGODB_URI,
// set this to build
// dir: 'build/',
dir: 'client/',
fileDir: 'files/',
sessionSecret: process.env.SESSION_SECRET || 'MEAN',
adminAccountEmail: process.env.ADMIN_ACCOUNT_EMAIL || 'admin@simpleyachtjobs.com',
adminAccountPassword: process.env.ADMIN_ACCOUNT_PASSWORD || 'password'
}