我可以使用module.export导出异步函数的结果吗?

时间:2018-04-24 00:31:18

标签: node.js

例如,在npm mongodb提供的用于建立连接的代码中:

const MongoClient = require('mongodb').MongoClient;
MongoClient.connect(url).then(connection => {
  const db = connection.db('myDB');
});

我希望导出db以用于其他文件。需要它的第一个文件需要等待承诺解析,后续文件不需要。有没有办法实现这个目标?

当然,在这个特殊情况下,有很多其他方法可以编写关于mongodb的代码,但我在更一般的意义上提出这个问题。

谢谢!

2 个答案:

答案 0 :(得分:0)

  

我可以使用module.export导出异步函数的结果吗?

不,你不能直接导出通过异步函数调用获得的东西。

module.exports已分配并同步返回(您无法更改)。因此,如果要异步分配module.exports,模块将在异步函数返回之前加载并返回。调用者必须有一些等待的方法,直到完成异步操作才能获得结果。通常的方法是通过回调函数或导出使用所需值解析的promise。

通常的解决方法是导出一个承诺(我在这里称之为dbPromise)然后调用者可以使用类似的东西:

 const myModule = require('someModule');
 myModule.dbPromise.then(db => {
     // can use db in here
 });

其他相关参考文献:

Importing / exporting only after certain promises have resolved

exporting after promise finishes

value from promise is not being exported to another module

答案 1 :(得分:-2)

在这里,我为您制作了一个非常简单的脚本,希望这会有所帮助

  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;