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