簡體   English   中英

如何為 express.js 應用創建超級管理員帳戶?

[英]How do I create a superadmin account for an express.js app?

我想確保每次 express.js 應用程序啟動時,都會對 mongodb 實例用戶集合進行查詢,以確保超級管理員帳戶存在。 但是,express.js 應用程序設置階段的所有內容都是同步的。

我的一些想法是:

  1. 有一個注冊模塊的系統。 每個模塊都可以用 require 加載,並且有一個init方法,可以使用async模塊的each方法調用它,該方法傳遞一個回調。 一旦模塊上的所有 init 方法都執行完回調函數,就會運行app.listen(process.env.PORT)

  2. 編寫在命令行執行的 express.js 應用程序之外的安裝腳本。 此腳本使用 mongoose 連接到 mongodb 數據庫,進行一些查詢,然后終止。 可以將它添加到 heroku.sh 文件以確保它在每次 express.js 應用程序啟動時運行。

  3. 在 express.js 設置階段使用waitfor同步運行數據庫查詢? 這將使想法和代碼保持干凈和簡單,但僅使用 Fibers 來完成這項任務似乎有點過分。

您不需要同步執行數據庫查找。 一旦您確認用戶存在,只需在您的數據庫請求的回調中啟動您的快速服務器。 這是一個偽示例:

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

我只是將一個 init 函數隔離到一個單獨的文件中。 它只在這里檢查管理員用戶的數據庫,但在未來,我可以注冊通過appdb對象傳遞的模塊,我將使用async.each異步加載模塊並在每個模塊上運行init方法以開始系統。 一旦它們全部注冊,在快速服務器上運行init

服務器.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'
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM