[英]Can I export the result of an asynchronous function with module.export?
例如,在npm mongodb
提供的以下代码中建立连接:
const MongoClient = require('mongodb').MongoClient;
MongoClient.connect(url).then(connection => {
const db = connection.db('myDB');
});
我希望导出db
以在其他文件中使用。 需要它的第一个文件将需要等待promise解决,而随后的文件则不需要。 有没有办法做到这一点?
当然,在这种特殊情况下,有关mongodb的代码还有多种其他写法,但是我是从更一般的意义上问这个问题。
谢谢!
我可以使用module.export导出异步函数的结果吗?
不,您不能直接导出通过异步函数调用获得的内容。
module.exports
是同步分配和返回的(您不能更改)。 因此,如果要异步分配给module.exports
,则模块将在异步函数返回之前加载并返回。 调用方将必须具有某种等待方式,直到异步操作完成才能获得其结果。 通常的方法是通过回调函数或通过导出以所需值解析的promise。
通常的解决方法是导出promise(我在此处将其dbPromise
),然后调用方可以使用类似以下内容的方法:
const myModule = require('someModule');
myModule.dbPromise.then(db => {
// can use db in here
});
其他相关参考资料:
在这里,我为您制作了一个非常简单的脚本,希望对您有所帮助
var mongodb = require('mongodb').MongoClient;
var settings = require("./settings.js");
var ObjectId = require('mongodb').ObjectID;
var db = {
removeData: function(collection, query, callback) {
mongodb.connect(settings.db_url, function(err, client) {
var database = client.db(settings.db_name);
if (err) throw err;
database.collection(collection).remove(query, function(err, result) {
client.close();
if (err) throw err;
callback(result);
});
});
},
selectData: function(collection, query, callback, project = false) {
mongodb.connect(settings.db_url, function(err, client) {
var database = client.db(settings.db_name);
if (err) throw err;
if (project !== false) {
console.log("Project is not false");
console.log( project);
database.collection(collection).find(query, project).toArray(function(err, result) {
client.close();
if (err) throw err;
callback(result);
});
} else {
database.collection(collection).find(query).toArray(function(err, result) {
client.close();
if (err) throw err;
callback(result);
});
}
});
},
insertManyData: function(collection, obj, callback) {
mongodb.connect(settings.db_url, function(err, client) {
var database = client.db(settings.db_name);
database.collection(collection).insertMany(obj, function(err, res) {
if (err) throw err;
client.close();
callback(res);
});
});
},
insertData: function(collection, obj, callback) {
obj._id = ObjectId();
mongodb.connect(settings.db_url, function(err, client) {
var database = client.db(settings.db_name);
var id = db.ObjectId();
obj._id = id;
obj.__id = id.toString();
database.collection(collection).insertOne(obj, function(err, res) {
if (err) throw err;
client.close();
callback(res);
});
});
},
updateData: function(collec, query, values, callback) {
mongodb.connect(settings.db_url, function(err, client) {
var database = client.db(settings.db_name);
database.collection(collec).updateOne(query, values, function(err, res) {
if (err) throw err;
client.close();
callback(res);
});
});
},
aggregate: function(collec, query, callback) {
mongodb.connect(settings.db_url, function(err, client) {
var db = client.db(settings.db_name);
var collection = db.collection(collec);
collection.aggregate(query).toArray(function(err, docs) {
client.close();
callback(docs);
});
});
},
ObjectId: function(id) {
return ObjectId(id);
}
}
module.exports = db;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.