簡體   English   中英

我可以使用module.export導出異步函數的結果嗎?

[英]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
 });

其他相關參考資料:

只有在某些承諾解決后才能導入/導出

承諾完成后出口

來自promise的值未導出到另一個模塊

在這里,我為您制作了一個非常簡單的腳本,希望對您有所幫助

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM