【问题标题】:Can't resolve "TypeError: not a function" error无法解决“TypeError:不是函数”错误
【发布时间】:2019-11-02 12:55:24
【问题描述】:

我正在尝试使用 mongodb 的节点驱动程序将 Express 应用程序连接到 mongodb。出于某种原因,我不断收到 TypeError: mongodbconnect is not a function。我想我已经正确地导出/导入了这个函数,也不认为我有任何循环引用。我无法理解我的代码有什么问题。

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 还很陌生。因此,我们将不胜感激。

【问题讨论】:

  • 您好,您是否在启动应用程序之前运行了“mongod.exe”。 'docs.mongodb.com/v3.2/tutorial/install-mongodb-on-windows/…这个链接
  • @DasunManathunga:我没有。我原以为如果在应用程序之前没有盯着 mongod,应用程序至少会尝试连接到 mongodb 并给出一个错误,表明 mongo 服务器没有运行。相反,我得到了关于 mongodbconnect 不是函数的错误。不确定我是否理解我得到的错误是如何与 mongod 不活动有关的。如果我在应用程序之前启动 mongod,则会收到以下错误:“app.set 不是函数”。我不明白如何正确从 app.js 导出“app”,因为它在 app.js 的 mongodbconnect 中。

标签: javascript node.js mongodb express


【解决方案1】:

模块初始化错误。

您推迟了在 app.js 中设置 module.exports 的行为

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

你有代码module.exports = app;在你传递给 mongodbconnect 的回调中,在模块初始化完成之前不会被调用(“require” app.js)。

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

【讨论】:

  • 这就是我正在努力解决的问题。关于如何修改代码的任何建议?我应该从 www.js 调用 mogodbconnect(带有回调)并在回调中包含 app.set('port', port) 吗?如果没有,感谢您在完成这项工作方面的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 2021-06-21
  • 2017-03-26
  • 2022-10-15
  • 2014-11-18
  • 2018-12-24
相关资源
最近更新 更多