2016-08-16 30 views
0

我想确保每次express.js应用程序启动时,都会对mongodb实例用户集合进行查询,以确保superadmin帐户存在。但是,express.js应用程序的设置阶段中的所有内容都是同步的。如何为express.js应用程序创建superadmin帐户?

一些想法,我有如下:

  1. 有注册模块的系统。每个模块都可以加载require,并有一个init方法,可以使用async模块的each方法调用回调方法。一旦模块上的所有init方法完成执行,回调函数将运行app.listen(process.env.PORT)

  2. 编写在命令行执行的express.js应用程序之外的安装脚本。该脚本通过猫鼬连接到mongodb数据库,进行一些查询并终止。可以将它添加到heroku.sh文件中,以确保它在每次启动express.js应用程序时都运行。

  3. 使用waitfor在express.js设置阶段同步运行数据库查询?这将保持想法和代码的清洁和简单,但对于这一项任务来说,使用Fibers看起来过分夸张。

+1

你为什么不只是在设置/启动快递之前检查您的superadmin用户是否存在? – Wake

+0

因为它需要使用猫鼬进行异步调用。我应该使用waitfor节点模块在Express启动时同步运行该代码吗? –

回答

1

您不需要同步执行数据库查找。在验证用户存在后,只需从数据库请求的回调中启动Express服务器即可。这里是一个伪示例:

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 
     } 
    }); 
}); 
0

我只是将一个init函数分离到一个单独的文件中。它只在这里为管理员用户检查数据库,但将来我可以注册通过appdb对象的模块,我将使用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 || '[email protected]', 
    adminAccountPassword: process.env.ADMIN_ACCOUNT_PASSWORD || 'password' 
} 
相关问题