簡體   English   中英

即使使用 module.exports,NodeJS 和 MongoDB 也會丟失變量的定義

[英]NodeJS and MongoDB losing the definition of a variable even with module.exports

您好,我正在嘗試從我的 mongodb 數據庫中獲取一些合作伙伴名稱並將它們放入變量列表中。 但是當我嘗試導出它時,由於某種原因它失去了它的定義。 這是怎么回事?

這是第一個文件。

///// mongodb.js /////

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

const findDocuments = function(db, callback) {
  // Get the documents collection
  const collection = db.collection('partners');
  // Find some documents
  collection.find({}).toArray(function(err, docs) {
    assert.equal(err, null);
    callback(docs);
  });
};

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'yarle';

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
  assert.equal(null, err);
  console.log("Connected succesfully to Database");

  const db = client.db(dbName);

  findDocuments(db, function(docs) {
    module.exports = {
      partner1: console.log(docs[0]['partner_name']),
      partner2: console.log(docs[1]['partner_name']),
      partner3: console.log(docs[2]['partner_name']),
    };
    client.close();
  });
});

//console.log(Object.keys(partners[0][0]));

這是最終文件。

///// Endfile.ts /////
import { Request, Response } from 'express';
import { PartnersList } from './data.d';

var partners = require( './mongodb.js');

console.log(partners.partner1);

const titles = [
  partners.partner1,
  partners.partner2,
  partners.partner3,
];

您的問題不在於 module.exports,而在於異步編程 當您調用 MongoClient.Connect 時,您的回調中的代碼不會同步執行。 它會在未來的某個時間執行。 你無法控制這種情況何時發生。

findDocument 回調也是如此。

異步編程有點棘手,但您必須學習它才能編寫現代 javascript。 異步是 nodejs 的核心原則。 閱讀它,學習示例,您的問題就會變得清晰。

不是導出 partner1、2 和 3 的值,而是導出帶有回調的函數。 這個新函數可以調用 MongoClient.Connect,傳遞回調。 Endfile.ts 現在可以調用您新創建的異步函數並在回調中分配 titles 數組。

像這樣:

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

const findDocuments = function (db, callback) {
  // Get the documents collection
  const collection = db.collection('partners');
  // Find some documents
  collection.find({}).toArray(function (err, docs) {
    assert.equal(err, null);
    callback(docs);
  });
};

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'yarle';

module.exports.getPartners = (callback) {

  // Use connect method to connect to the server
  MongoClient.connect(url, function (err, client) {
    if (err) {
      callback(err);
      return;
    }
    console.log("Connected succesfully to Database");

    const db = client.db(dbName);

    findDocuments(db, function (docs) {
      const partners = {
        partner1: docs[0]['partner_name'],
        partner2: docs[1]['partner_name'],
        partner3: docs[2]['partner_name']
      };
      callback(null, partners);
      client.close();
    });
  });

}

和這個

import { Request, Response } from 'express';
import { PartnersList } from './data.d';

var mongoClient = require('./mongodb.js');
mongoClient.getPartners(function (err, partners) {
  assert.equal(null, err);
  const titles = partners;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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