Не удалось устранить ошибку «Ошибка типа: не функция» - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь подключить приложение Express к mongodb, используя драйвер узла для mongodb. По какой-то причине я продолжаю получать TypeError: mongodbconnect не является функцией. Я думаю, что я правильно экспортировал / импортировал эту функцию и не думаю, что у меня также есть циклические ссылки. Я не могу понять, что не так с моим кодом.

www.js (здесь приложение начинается с nodemon):

var app = require('../app');
var debug = require('debug')('myapp:server');
var http = require('http');

var port = normalizePort(process.env.PORT || '8085'); /*function normalizePort defined elsewhere in this file*/
app.set('port', port);

var server = http.createServer(app);
server.listen(port);
server.on('error', onError); /*function onError defined elsewhere in this file*/
server.on('listening', onListening); /*function onListening defined elsewhere in this file*/

app.js

/*required body-parser, cookie-parser, cors, http-errors, express, morgan, path and Winston*/
var mongodbconnect = require('./mongodbconnect');
var contactUsRouter = require(path.join(__dirname, 'routes', 'contactUs'));

//connecting to MongoDB
mongodbconnect(function(err,databaseName){
  if (err) console.log(err)
  var app = express();
  app.set('views', path.join(__dirname, 'views'));
  app.set('view engine', 'ejs');
  app.use(logger('dev'));
  app.use(express.json());
  app.use(express.urlencoded({ extended: false }));
  app.use(cookieParser());
  app.use(express.static(path.join(__dirname, 'public')));
  app.use(cors());
  app.use('/api/contactus', contactUsRouter);

  //error handler
  app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  res.status(err.status || 500);
  res.status(500).send('Problem');
  });

  module.exports = app;
})

mongodbconnect.js

var assert = require('assert'); //used for MongoDB connection
var MongoClient = require('mongodb').MongoClient;

var url = "mongodb://userID:passwd@localhost:27017/databank?authSource=admin";
var mongoDB_Options = {
  poolSize: 100,
  keepAlive: true,
  keepAliveInitialDelay: 300000,
  reconnectInterval: 1000,
  reconnectTries: 10,
  autoReconnect: true,
  socketTimeoutMS: 360000,
  connectTimeoutMS: 30000
};
var dbName = 'bank';
function connectToMongoServer(callback){
  Mongoclient.connect(url, mongoDB_Options, function(err, client){
    assert.equal(null, err);
    console.log('Connected successfully to server');
    var db = client.db(dbName);
    return callback(err);
  });
};
module.exports = connectToMongoServer;

Я ожидал, что этот код позволит мне подключиться к серверу MongoDB, запустить мое экспресс-приложение и позволить моему внешнему приложению Angular 7 выполнять операции CRUD в базе данных MongoDB. Вместо этого я получаю эту ошибку «mongodbconnect is not function». Подскажите, пожалуйста, что не так с моим кодом? Пожалуйста, имейте в виду, что я довольно плохо знаком с javascript, Node и Express. Так что простое объяснение будет оценено.

1 Ответ

0 голосов
/ 19 июня 2019

Инициализация модуля неверна.

Вы отложили процесс установки module.exports в app.js

В app.js вы откладываете настройку module.exports до тех пор, пока не завершится асинхронный обратный вызов mongodbconnect.

У вас есть код module.exports = app; внутри обратного вызова , который вы передали в mongodbconnect, который не вызывается до завершения инициализации модуля («require» приложения .js).

К тому времени, уже слишком поздно. В www.js app уже присвоено значение, и это не тот объект, который вы присваиваете module.exports в app.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...