无法解决“ TypeError:不是函数”错误

时间:2019-06-19 18:06:19

标签: javascript node.js mongodb express

我正在尝试使用mongodb的节点驱动程序将Express应用程序连接到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服务器,启动我的Express应用程序,并允许我的前端Angular 7应用程序在MongoDB数据库中执行CRUD操作。相反,我收到此“ mongodbconnect不是函数”错误。您能告诉我我的代码有什么问题吗?请记住,我对javascript,Node和Express不熟悉。因此,简单的解释将不胜感激。

1 个答案:

答案 0 :(得分:0)

模块初始化错误。

您推迟了在app.js中设置module.exports的操作

在app.js中,将module.exports的设置推迟到mongodbconnect的异步回调完成之后。

您在传递给mongodbconnect的回调中包含代码module.exports = app; ,该代码在模块初始化完成之前不会被调用(“需要”)。

到那时,为时已晚。在www.js中,已经为app分配了一个值,并且它与您在app.js中分配给module.exports的对象不同。