路由回调没有执行,但中间件是

时间:2017-02-07 04:52:44

标签: node.js express

所以这个项目在今天之前运行正常,但是在git出现了一些不正常的错误之后我破坏了我的项目,并且无法恢复提交。在花了一些时间解决所有问题之后,我的路线现在已被打破。我的问题是,当现在调用我的API路由时,服务器会挂起1分钟,然后超时并在服务器上记录404。

为了给出一些背景知识,我正在使用this样板文件。在我的调试过程中,我基本上把console.logs放在我可能的任何地方,看起来我所有的快速和护照的初始化中间件工作正常,我的代码到达定义路线没有错误。

具有app.use的中间件可以正常工作,并且在发出请求时都会检出,并且我放在那里的所有console.log都显示正常。 console.logs仅停止出现在最终路由定义中,如下例所示:

app.get('/route', function(req, res, next) {
    console.log('this never shows');
    next();
}, function(req, res, next) {
    console.log('this never shows');
})

我的实际路线确实有res.send(),这只是向您展示的一个示例。我在此路由之前放入中间件的所有console.logs都会在请求发出时显示,因此它挂在app的某处。

这是一个相当大的项目,所以如果你想要特定的代码示例,请询问,我会发布它。但是我能够恢复我在其他地方保存的所有重要文件,我很确定我的所有代码都恢复到现在之前的状态。

编辑:

这是我的文件,带有快速中间件定义: 配置/ express.js

/**
 * Module dependencies.
 */

var express = require('express');
var MongoStore = require('connect-mongo')(express);
var flash = require('connect-flash');
var helpers = require('view-helpers');
var swig = require('swig');
var session = require('express-session');

module.exports = function (app, config, passport) {

  app.set('showStackError', true);
  // should be placed before express.static
  app.use(express.compress({
    filter: function (req, res) {
      return /json|text|javascript|css/.test(res.getHeader('Content-Type'));
    },
    level: 9
  }));
  app.use(express.favicon());
  app.use(express.static(config.root + '/public'));
  app.use('/uploads', express.static(config.root + '/uploads'));

  var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Methods, Access-Control-Allow-Headers, Access-Control-Allow-Origin, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
        res.status(204).end();
    }
    else {
        next();
    }
  };

  app.use(allowCrossDomain);

  // don't use logger for test env
  if (process.env.NODE_ENV !== 'test') {
    app.use(express.logger('dev'));
  }

  // set views path, template engine and default layout
  app.engine('html', swig.renderFile);
  app.set('view engine', 'html');
  app.set('views', config.root + '/app/views');
  app.set('view cache', process.env.NODE_ENV !== 'development');

  app.configure(function () {
    // dynamic helpers
    // app.use(function(req,res,next){
    //     req.locals.session = "eeeeeeee";
    //     next();
    // });

    // cookieParser should be above session
    app.use(express.cookieParser());

    // bodyParser should be above methodOverride
    app.use(express.bodyParser());
    app.use(express.methodOverride());

    // express/mongo session storage
    app.use(function(req, res, next) {
        if(!req.cookies['_ga']) {
            next();
        }
        else {
            session({
                secret: 'secrettexthere',
                saveUninitialized: true,
                resave: true,
                store: new MongoStore({
                    url: 'mongodb://localhost/traderdb',
                    db: 'traderdb',
                    collection: 'sessions',
                    auto_reconnect: true
                })
            })(req, res, next);
        }
    });

    // connect flash for flash messages
    app.use(flash());

    app.use(function (req, res, next) {
        res.locals.session = req.session;
        res.locals.req = req;
        next();
    });
    app.use(function(req, res, next) {
        if(!req.cookies['_ga']) {
            next();
        }
        else {
            passport.initialize()(req, res, next);
        }
    });

    //app.use(helpers('app name'));
    //
    // use passport session
    app.use(function(req, res, next) {
        if(!req.cookies['_ga']) {
            next();
        }
        else {
            passport.session()(req, res, next);
        }
    });

    // routes should be at the last
    app.use(app.router);

    // assume "not found" in the error msgs
    // is a 404. this is somewhat silly, but
    // valid, you can do whatever you like, set
    // properties, use instanceof etc.
    app.use(function(err, req, res, next) {
      // treat as 404
      if (~err.message.indexOf('not found')) return next();

      // log it
      console.error(err.stack);

      // error page
      res.status(500).render('500', { error: err.stack });
    });

    // assume 404 since no middleware responded
    app.use(function(req, res, next) {
      res.status(404).render('404', { url: req.originalUrl, error: 'Not found' })
    });

  })
}

我还有另一个带有护照路径定义的文件,如果你也想看到它,但是所有测试过的都可以正常工作。

编辑2:

这是我的入口点文件: server.js

/**
 * Module dependencies.
 */

var express = require('express')
  , fs = require('fs')
  , passport = require('passport');

/**
 * Main application entry file.
 * Please note that the order of loading is important.
 */

// Load configurations
// if test env, load example file
var env = process.env.NODE_ENV || 'development'
  , config = require('./config/config')[env]
  , auth = require('./config/middlewares/authorization')
  , mongoose = require('mongoose');

// Bootstrap db connection
mongoose.connect(config.db);

// Bootstrap models
var models_path = __dirname + '/app/models'
fs.readdirSync(models_path).forEach(function (file) {
  require(models_path+'/'+file);
});

// bootstrap passport config
require('./config/passport')(passport, config);

var app = express();
// express settings
require('./config/express')(app, config, passport);

// Bootstrap routes
require('./config/routes')(app, passport, auth);

// Start the app by listening on <port>
var port = 3002;
app.listen(port);
console.log('Express app started on port '+port);

// expose app
exports = module.exports = app;

编辑3:

以下是我的路线定义: 配置/ routes.js

var express = require('express');
var path = require('path');
var fileManager = require('express-file-manager');
var mongoose = require('mongoose');
var Session = mongoose.model('Session');

module.exports = function (app, passport, auth) {
    var users = require('../app/controllers/users');
    var coupons = require('../app/controllers/coupons');
    var magazines = require('../app/controllers/magazines');
    var zones = require('../app/controllers/zones');
    var transactions = require('../app/controllers/transactions');
    var favorites = require('../app/controllers/favorites');
    var banners = require('../app/controllers/banners');
    var reports = require('../app/controllers/reports');
    var coverContest = require('../app/controllers/coverContest');
    var contactMessage = require('../app/controllers/contactMessage');

    app.post('/api/users/login', users.login);
    app.post('/api/users/register', users.register);
    app.post('/api/users/logout', users.logout);
    app.post('/api/users/sendResetEmail', users.sendResetEmail);
    app.post('/api/users/changePassword', users.changePassword);
    app.post('/api/users/redeemCoupon', isValidAppUser(), users.redeemCoupon);
    app.get('/api/users/validate', isLoggedIn(0), function(req, res) {
        res.send(req.user);
    });

    app.post('/api/coupons', coupons.get);
    app.post('/api/coupons/import', isLoggedIn(0), coupons.import);
    app.post('/api/coupons/remove', isLoggedIn(0), coupons.remove);
    app.post('/api/coupons/upload', isLoggedIn(0), coupons.upload);

    app.post('/api/transactions', transactions.get);
    app.post('/api/allTransactions', isLoggedIn(0), transactions.getAll);

    app.post('/api/magazines', magazines.get);
    app.post('/api/magazines/import', isLoggedIn(0), magazines.import);
    app.post('/api/magazines/remove', isLoggedIn(0), magazines.remove);

    app.post('/api/banners', banners.get);
    app.post('/api/banners/import', isLoggedIn(0), banners.import);
    app.post('/api/banners/remove', isLoggedIn(0), banners.remove);

    app.post('/api/favorites', isValidAppUser(), favorites.get);
    app.post('/api/favorites/import', isValidAppUser(), favorites.import);

    app.post('/api/zones', zones.get);
    app.post('/api/zones/add', zones.add);
    app.post('/api/zones/addCoupon', zones.addCoupon);
    app.post('/api/zones/addMagazine', zones.addMagazine);

    app.post('/api/mail/ccSubmit', coverContest.ccSubmit);
    app.post('/api/mail/contactSubmit', contactMessage.contactSubmit);

    //app.get('/api/reports/siteUsers', reports.siteUsers);
    app.get('/auth/facebook', passport.authenticate('facebook', { scope: [ 'email', 'user_about_me'], failureRedirect: '/login' }), users.signin);
    app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }), users.authCallback);
    app.get('/auth/github', passport.authenticate('github', { failureRedirect: '/login' }), users.signin);
    app.get('/auth/github/callback', passport.authenticate('github', { failureRedirect: '/login' }), users.authCallback);
    app.get('/auth/twitter', passport.authenticate('twitter', { failureRedirect: '/login' }), users.signin);
    app.get('/auth/twitter/callback', passport.authenticate('twitter', { failureRedirect: '/login' }), users.authCallback);
    app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));
    app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/', successRedirect: '/main.html' }));
}

function isLoggedIn(secLvl) {
    return function(req, res, next) {
        if(req.isAuthenticated() && req.user.secLvl <= secLvl && req.user.google.email.includes('@bizpub36.com')) {
            return next();
        }

        res.redirect('https://accounts.google.com/logout');
    }
}

function isValidAppUser() {
    return function(req, res, next) {
        Session.findOne({ sess_id: req.body.sess_id }).exec(function(err, session) {
            if(!err && session) {
                next();
            }
            else {
                res.end({ status: 'error', message: 'invalid session' });
            }
        });
    }
}

2 个答案:

答案 0 :(得分:0)

如果app.use有效,我的猜测就是你的协议,app.get是否正确?您的问题位于代码库中的其他位置,因为您的示例作为单个路由快速应用运行正常。

答案 1 :(得分:0)

这听起来像三件事之一:

  1. 在您的中间件链中的某个地方,您没有调用next()以允许它前进到下一级处理程序,因此请求最终超时等待该中间件完成(这似乎是符合你描述的症状。

  2. 不知何故,您的app.get()实际上并不匹配您预期或未正确指定的路线。

  3. 您正在使用路由器,但尚未正确配置。

  4. 但是,因为你没有立即获得404,而是超时,它可能是上面的选项#1。