【问题标题】:NodeJS module.exports does not work as expectedNodeJS module.exports 无法按预期工作
【发布时间】:2015-11-27 18:24:34
【问题描述】:

我正在使用 Express 在 NodeJS 中编写 Web 服务。当我想在其他模块中使用应用程序(Express 实例)时,就会出现我的问题。以下配置工作正常,但如果我替换

var app = module.exports = express();

var app = express();

然后使用

module.exports = app;

在 app.js 的底部,一切都会崩溃。在 auth 模块中调用 app.get() 会报错(TypeError: app.get is not a function)。有人可以向我解释为什么我在哪里导出 app 对象很重要吗?

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;

【问题讨论】:

    标签: node.js express


    【解决方案1】:

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

    在您的 app.js 文件中,您需要 auth.js,而在 auth.js 中,您需要 app.js。通过将module.exports = app 移动到app.js 的底部,它在var auth = require('./routes/auth'); 之后被调用。这意味着当在 auth.js 中调用 var app = require("../app"); 时,module.exports 将不会在 app.js 中定义,从而导致错误。

    【讨论】:

      猜你喜欢
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 2014-12-09
      • 2016-01-13
      相关资源
      最近更新 更多