NodeJS и MongoDB теряют определение переменной даже с module.exports - PullRequest
0 голосов
/ 11 февраля 2020

Здравствуйте, я пытаюсь получить имена партнеров из моей базы данных 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,
];

1 Ответ

1 голос
/ 11 февраля 2020

Ваша проблема не в module.exports, а в асинхронном программировании . Когда вы вызываете MongoClient.Connect, код вашего обратного вызова не выполняется синхронно. Это будет выполнено некоторое время в будущем. Вы не можете контролировать, когда это произойдет.

То же самое относится и к обратному вызову findDocument.

Асинхронное программирование немного сложнее, но вам придется научиться писать современный javascript. Асинхронность является центральной t enet из nodejs. Прочтите его , изучите примеры, и ваша проблема станет понятной.

Вместо экспорта значений partner1, 2 и 3 экспортируйте функцию с обратным вызовом. Эта новая функция может вызывать MongoClient.Connect, передавая обратный вызов. Endfile.ts теперь может вызывать вновь созданную асинхронную функцию и назначать массив заголовков в обратном вызове.

Примерно так:

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;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...