【问题标题】:Can I export the result of an asynchronous function with module.export?我可以使用 module.export 导出异步函数的结果吗?
【发布时间】:2018-10-04 03:04:42
【问题描述】:

例如在npm mongodb提供的这段代码中建立连接:

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

我希望导出db 以在其他文件中使用。第一个需要它的文件需要等待 promise 解决,后续文件不需要。有没有办法做到这一点?

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

谢谢!

【问题讨论】:

  • 这可能是可能的。您可以将数量惊人的逻辑推送到模块加载器中。对于像数据库访问这样的东西,这不是一个好主意

标签: node.js


【解决方案1】:

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

不,您不能直接导出通过异步函数调用获得的内容。

module.exports 被分配并同步返回(您无法更改)。因此,如果您异步分配给module.exports,模块将在您的异步函数返回之前加载并返回。调用者必须有某种方法等待异步操作完成才能获得结果。通常的方法是通过回调函数或导出一个以期望值解析的承诺。

通常的解决方法是导出一个承诺(我在这里称之为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

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 在 settings.js 文件中,您存储了 db_url 等设置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2023-01-10
    • 2022-01-03
    相关资源
    最近更新 更多