Node.js NodeJS module.exports无法按预期工作

Node.js NodeJS module.exports无法按预期工作,node.js,express,Node.js,Express,我正在使用Express在NodeJS中编写一个web服务。我的问题发生在我想在其他模块中使用应用程序(Express instance)时。以下配置工作正常,但是如果我替换 var app = module.exports = express(); 与 然后使用 module.exports = app; 在app.js的底部,一切都会崩溃。在auth模块中调用app.get()时将出现错误(TypeError:app.get不是函数)。有人能给我解释一下为什么在哪里导出应用程序对象很重要

我正在使用Express在NodeJS中编写一个web服务。我的问题发生在我想在其他模块中使用应用程序(Express instance)时。以下配置工作正常,但是如果我替换

var app = module.exports = express();

然后使用

module.exports = app;
在app.js的底部,一切都会崩溃。在auth模块中调用app.get()时将出现错误(TypeError:app.get不是函数)。有人能给我解释一下为什么在哪里导出应用程序对象很重要吗

app.js

var mongoose = require('mongoose');
var express = require('express');
var bodyParser = require('body-parser');
var debug = require('debug')('app');
var morgan = require('morgan');
var config = require('./config');
var app = module.exports = express();

// --- globals ---
app.set('jwtTokenSecret', config.jwtTokenSecret);

// --- middleware ---
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(morgan('dev'));

// --- routes ---
var courses = require('./routes/courses');
var users = require('./routes/users');
var auth = require('./routes/auth');

app.use('/auth', auth);
app.use('/courses', courses);
app.use('/users', users);

// --- database connection ---
mongoose.set('debug', true);

mongoose.connect(config.database, function(err) {
    if (err) {
        debug('Could not establish connection to mongodb');
    } else {
        debug('Successfully connected to mongodb');
    }
});
路由/auth.js

var express = require('express');
var router = express.Router();
var moment = require('moment');
var jwt = require('jwt-simple');
var User = require("../models/User");
var debug = require('debug')('app');
var app = require("../app");

// POST /auth
router.post('/', function(req, res, next) {
    User.findOne({
        'username' : req.body.username
    }, function(err, user) {
        if (err || !user) {
            res.status(401).json({ error: "No user found"});
            return;
        }
        if (user.password != req.body.password) {
            res.send(401);
        }

        debug(app.get('database'));

        var expires = moment().add(7, 'days').valueOf();
        var token = jwt.encode({
            user: user.username,
            exp: expires
        }, app.get('jwtTokenSecret'));

        res.json({
            success: true,
            token: token
        });
    });
});

module.exports = router;

这是因为app.js和auth.js之间存在循环依赖关系

在app.js文件中,您需要auth.js,而在auth.js文件中,您需要app.js。通过将
module.exports=app
移动到app.js的底部,在
var auth=require('./routes/auth')之后调用它。这意味着当
var-app=require(“../app”)
在auth.js中调用,
模块。app.js中尚未定义导出
,因此导致错误

var express = require('express');
var router = express.Router();
var moment = require('moment');
var jwt = require('jwt-simple');
var User = require("../models/User");
var debug = require('debug')('app');
var app = require("../app");

// POST /auth
router.post('/', function(req, res, next) {
    User.findOne({
        'username' : req.body.username
    }, function(err, user) {
        if (err || !user) {
            res.status(401).json({ error: "No user found"});
            return;
        }
        if (user.password != req.body.password) {
            res.send(401);
        }

        debug(app.get('database'));

        var expires = moment().add(7, 'days').valueOf();
        var token = jwt.encode({
            user: user.username,
            exp: expires
        }, app.get('jwtTokenSecret'));

        res.json({
            success: true,
            token: token
        });
    });
});

module.exports = router;