Node.js MongoDB驱动程序异步引发异常

时间:2019-11-03 04:26:53

标签: javascript node.js mongodb asynchronous

我是node.js的新手。并且在诺言样式中使用MongoDB驱动程序时遇到问题。我有一个共享连接的课程:

MongoConnection.js

function show_draft(){
    $.ajax({
        type: 'ajax',
        url: '<?php echo base_url() ?>ct_backend/show_draft',
        async: false,
        dataType: 'json',               
        success: function(data){
            var html = '';
            var i;
            for(i=0; i<data.length; i++){

                html +='<div class="media dashboard-draft-each">'+
                '<div class="media-body custom-form-button">'+
                '<ul>'+
                '<li class="dropdown">'+
                '<a href="#" class="nav-link" data-toggle="dropdown">'+
                '<span class="fa fa-ellipsis-h"></span>'+
                '</a>'+
                '<div class="dropdown-menu">'+
                '<a href="javascript:;" class="dropdown-item draft-edit" data="'+data[i].id+'"><span class="fa fa-pencil-alt"></span> Edit</a>'+
                '<a href="javascript:;" class="dropdown-item draft-delete" data="'+data[i].id+'"><span class="fa fa-trash"></span> Delete</a>'+
                '</div>'+
                '</li>'+
                '</ul>'+
                '<a href="javascript:;" data="'+data[i].id+'">'+data[i].name+'</a>'+
                '<p>'+data[i].description+'</p>'+
                '<span class="far fa-clock"> '+<?php echo $controller->timestamp(data[i].published);?>+'</span>'+
                '</div>'+
                '</div>';                                       
            }
            $('#show_draft').html(html);
        },
        error: function(){
            Toast();
            function Toast (){
                var priority = 'danger';
                var title    = 'Error';
                var message  = 'Could not get Data from Database!';
                $.toaster({ priority : priority, title : title, message : message });
            }
        }
    });
}//end Show draft   

然后我将其包含在主应用程序中

app.js

/**
 * Singleton Class Creating MongoDB Connection
 */
class MongoConnection {
    constructor (url, options) {
        if(!MongoConnection.instance) {
            this.client = new MongoClient(url, options);
            this.connect = this.client.connect();
            MongoConnection.instance = this;
        }
        return MongoConnection.instance;
    }
}

module.exports = { MongoConnection };

建立数据库连接后,我在类方法中使用它。这种方法返回了这样的承诺

ModelClass.js

const { MongoConnection } = require('./libs/classes/MongoConnection');
const url = 'mongodb://user:pass@localhost:27017/SecretDB';
const options = {
    .....
};

const mongoClient = new MongoConnection(url, options);

.....


// Connecting to MongoDB
mongoClient.connect.then(() => {
    app.listen(PORT, HOST, () => {
        const timeStart = Date();
        console.info(`${timeStart} -`, 'Server started at:', `http://${HOST}:${PORT}`);

    });
})
    .catch((err) => {
        console.error('Couldn\'t establish database connection. Quiting the Server');
        process.exit(1);
    });

返回的promise像这样在Express路由控制器中使用

Controller.js

Some validation
const result = {...} // Object used as a result with errors during validation
......

// Trying to connect to Database
return this.mongo.connect.then(() => {
    try {
        const doc  = { user: this.login, password: this.password };
        const db   = this.mongo.client.db('SecretDB');        
        const coll = db.collection('users');
        coll.insertOne(doc, (err, result) => {
            if(err) throw err;
        });
        return result;
    }
    catch (err) {
        throw err;
    }
})
    .catch((err) => {
        console.error(err);
        errors.server = 'Internal Server Error';
        result.errors = errors;
        result.success = false;
        return result;
    });

.......

一切正常,直到与Mongo Server的连接出现问题为止。例如,如果对 “ SecretDB” 的访问受到限制,则整个应用程序将崩溃:

ModelClass.js

const promiseResult = Obj.method();

promiseResult.then((result) => {

    if (!result.success) {        
        next(new Error(result));
    }
    else {
        try {
            res.render(
                .....
            );
        }
        catch (e) {
            throw e;
        }
    }
})
    .catch((err) => {
        try {
            res.render(
                .....
            );
        }
        catch (e) {
            next(new Error(err));
        }
    });

0 个答案:

没有答案
相关问题