Javascript Node/Express-MongoDB:Error:Route.get()需要回调函数,但得到了一个[object Undefined]

Javascript Node/Express-MongoDB:Error:Route.get()需要回调函数,但得到了一个[object Undefined],javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我一直在尝试将Node/express应用程序连接到MongoDB,但没有成功。 下面是代码中最重要的部分: app.js var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); var cor

我一直在尝试将Node/express应用程序连接到
MongoDB
,但没有成功。 下面是代码中最重要的部分:

app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require('cors');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var mongoose = require('mongoose');
const bodyParser = require('body-parser');
const vesselController = require('./controllers/VesselController');
require('./config/keys');

var app = express();
app.use(cors());
app.options('*', cors());

// DB Config
const db = require('./config/keys').MongoURI;

const options = {
    useNewUrlParser: true,
    reconnectTries: Number.MAX_VALUE,
    poolSize: 10
};

mongoose
    .connect(db, options)
    .then(() => console.log('MongoDB Connection established'))
    .catch((err) => console.log('Error connecting MongoDB database due to: ', err));

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Bodyparser
app.use(express.urlencoded({ extended: false }));

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('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    next(createError(404));
});

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    next();
});

// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

const PORT = process.env.PORT || 3000;

app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));
app.use(bodyParser.json({ limit: '50mb' }));
app.use(cors());

app.route('/vessels/all').get(vesselController.getBaseAll);
app.route('vessels/:id/track').get(vesselController.getCurrent);
app.route('/vessels').get(vesselController.getHistory);

app.listen(PORT, console.log(`Server started on port ${PORT}`));

module.exports = app;
const Vessels = require("../models/Vessels");
const Positions = require("../models/Positions");
const Compnanies = require("../models/Companies");

exports.getBaseAll = (req, res) => {
    Promise.all([
        Compnanies.find(),
        Vessels.find(),
        Positions.aggregate([
            {
                '$sort': {
                  'date': -1
                }
              }, {
                '$group': {
                  '_id': '$callsign', 
                  'details': {
                    '$push': '$$ROOT'
                  }
                }
              }, {
                '$replaceRoot': {
                  'newRoot': {
                    '$arrayElemAt': [
                      '$details', 0
                    ]
                  }
                }
              }
              ])
    ]).then(([companies, vessels, positions]) => {
        // apply vessels detail table as join:
        positions.forEach((pos) => {
            vessels.forEach((ves) => {
                if(pos.callsign == ves.callsign) {
                    p._detail = ves;
                }
            });
            companies.forEach((com) => {
                if(p._detail.company == com.number) {
                    p._detail = com;
                }
            });
        });
        res.status(200).json(positions);
    }).catch((err) => {
        return res.status(500).send(err);
    });
};


exports.getHistory = (req, res) => {
    var id = req.param.id;
    Positions.find({
        "callsign": id,
        "date": {
            $gte: new Date(Date.now() - (1000*60*60*24))
    }}, (err, task) => {
        if(err) {
            return res.status(500).send(err);
        }
        res.status(200).json(task);
    });
};

exports.getCurrent = (req, res) => {
    var currentPos = Positions.find({
        "date": {
            $gte: new Date(Date.now() - (1000*60*60))
    }});
    currentPos.exec((err, task) => {
        if(err) {
            return res.status(500).send(err);
        }
        res.status(200).json(task);
    });
};
VesselController.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require('cors');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var mongoose = require('mongoose');
const bodyParser = require('body-parser');
const vesselController = require('./controllers/VesselController');
require('./config/keys');

var app = express();
app.use(cors());
app.options('*', cors());

// DB Config
const db = require('./config/keys').MongoURI;

const options = {
    useNewUrlParser: true,
    reconnectTries: Number.MAX_VALUE,
    poolSize: 10
};

mongoose
    .connect(db, options)
    .then(() => console.log('MongoDB Connection established'))
    .catch((err) => console.log('Error connecting MongoDB database due to: ', err));

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Bodyparser
app.use(express.urlencoded({ extended: false }));

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('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    next(createError(404));
});

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    next();
});

// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

const PORT = process.env.PORT || 3000;

app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));
app.use(bodyParser.json({ limit: '50mb' }));
app.use(cors());

app.route('/vessels/all').get(vesselController.getBaseAll);
app.route('vessels/:id/track').get(vesselController.getCurrent);
app.route('/vessels').get(vesselController.getHistory);

app.listen(PORT, console.log(`Server started on port ${PORT}`));

module.exports = app;
const Vessels = require("../models/Vessels");
const Positions = require("../models/Positions");
const Compnanies = require("../models/Companies");

exports.getBaseAll = (req, res) => {
    Promise.all([
        Compnanies.find(),
        Vessels.find(),
        Positions.aggregate([
            {
                '$sort': {
                  'date': -1
                }
              }, {
                '$group': {
                  '_id': '$callsign', 
                  'details': {
                    '$push': '$$ROOT'
                  }
                }
              }, {
                '$replaceRoot': {
                  'newRoot': {
                    '$arrayElemAt': [
                      '$details', 0
                    ]
                  }
                }
              }
              ])
    ]).then(([companies, vessels, positions]) => {
        // apply vessels detail table as join:
        positions.forEach((pos) => {
            vessels.forEach((ves) => {
                if(pos.callsign == ves.callsign) {
                    p._detail = ves;
                }
            });
            companies.forEach((com) => {
                if(p._detail.company == com.number) {
                    p._detail = com;
                }
            });
        });
        res.status(200).json(positions);
    }).catch((err) => {
        return res.status(500).send(err);
    });
};


exports.getHistory = (req, res) => {
    var id = req.param.id;
    Positions.find({
        "callsign": id,
        "date": {
            $gte: new Date(Date.now() - (1000*60*60*24))
    }}, (err, task) => {
        if(err) {
            return res.status(500).send(err);
        }
        res.status(200).json(task);
    });
};

exports.getCurrent = (req, res) => {
    var currentPos = Positions.find({
        "date": {
            $gte: new Date(Date.now() - (1000*60*60))
    }});
    currentPos.exec((err, task) => {
        if(err) {
            return res.status(500).send(err);
        }
        res.status(200).json(task);
    });
};
我为解决问题所做的工作:

我遇到并分析了解决问题的帖子如下:

1) 但我还是有问题

2) 我也用过,但问题仍然存在

3) 但我仍然无法连接到
MongoDB


感谢您为解决此问题指明了正确的方向。

您能确定导致此问题的具体路线吗?@OTZ,感谢您阅读此问题。也许能帮我解决这个问题?嗯,那很有帮助。堆栈跟踪显示了错误的来源。您可以共享
vesselController
文件吗?当然,我用
vesselController.js
更新了这个问题
vesselController.js
似乎没问题,但是,错误的堆栈跟踪指向第77行,说
vesselController.getBaseAll
不是一个函数。我认为这很可能与如何导出/导入
VesselController
模块有关。你能试着注释掉第77行到第79行,看看应用程序启动是否正常吗?您还可以记录
vesselController
变量,查看它向控制台吐出的内容。