javascript - Expressjs - 所有路由都是 404

标签 javascript node.js express http-status-code-404 url-routing

在 My Express 应用中,出于某种原因,所有路由都返回 404。

服务器.js

/**
 * Module dependencies
 */

var express = require('express')
var passport = require('passport')
var env = process.env.NODE_ENV || 'development'
var config = require('./config/config')[env]
var mongoose = require('mongoose')
var fs = require('fs')

require('./helpers')
require('express-namespace')

mongoose.connect(config.db)

// Bootstrap models
fs.readdirSync(__dirname + '/app/models').forEach(function (file) {
  if (~file.indexOf('.js')) require(__dirname + '/app/models/' + file)
})

// Bootstrap passport config
require('./config/passport')(passport, config)

var app = express()

// Bootstrap application settings
require('./config/express')(app, config, passport)

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

// Start the app by listening on <port>
var port = config.port || process.env.PORT || 3000
app.listen(port)
console.log('Express app started on port '+port)

// Expose app
module.exports = app

路由.js

/**
 * Module dependencies.
 */

var mongoose = require('mongoose')
var passportOptions = {
  failureFlash: 'Invalid email or password.',
  failureRedirect: '/login'
}

// controllers
var home = require('home')
var functions = require('function')

/**
 * Expose
 */

module.exports = function (app, passport) {

  console.log("SR");
  app.get('/', function(req,res){
    console.log("//////");
  })
  app.get('/functions/get',functions.get)
  app.post('/functions/submit',functions.sub)
  app.get('/login',passport.authenticate('google',{
    "scope":"https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile",
    "hd":"kinokiapp.com"
  }))
  app.get('/google/callback',passport.authenticate('google', { failureRedirect:"/" }),function(req,res){
    res.end("auth")
  })

console.log("ER");
}

首页.js

/*!
 * Module dependencies.
 */

console.log("HIH");

exports.index = function (req, res) {
  res.render('home', {
    title: 'Node Express Mongoose Boilerplate'
  })
}

函数.js

var mongoose = require('mongoose')

var KIFunction = mongoose.model("KIFunction")

exports.get = function(req, res) {
    res.type('text/kinoki-function')
    res.status(200);
    var exclude
    try {
        exclude = JSON.parse(req.query.n)
    } catch (e) {
        exclude = []
    }
    for (var i = 0; i < exclude.length; i++) {
        if (typeof exclude[i] != 'string') {
            continue;
        }
        exclude[i] = mongoose.Types.ObjectId(exclude[i])
    }
    KIFunction.random({
        "_id":{
            "$nin":exclude
        },
        approved1:true,
        approved2:true,
    }).limit(10).exec(function(err,functions){
        if (err || functions.length == 0) {return res.end("false")}
        var out = ''
        functions.forEach(function(f){
            out += "{0}#{1}#{2}#{3}|".format(f.steps, f.string, f.difficulty, f._id)
        })

        res.end(out.substring(0, out.length - 1),"utf8")
    })
}


exports.sub = function(req,res){
    var fstr = req.body.str
    if (!(req.body.hasOwnProperty("str")) || !(fstr.match(KIFunction.functionRegex()))) {
        res.status(400)
        res.end("false")
        return
    }

    new KIFunction({
        string:fstr
    }).save(function(err){
        if(err) {
            res.status(200)
            return res.end("false")
        }
        res.status(200)
        res.end("true")
    })
}

输出是:

23 Aug 08:21:16 - [nodemon] starting node server.js HIH SR ER Express app started on port 3000 GET / 404 571ms - 863b

配置/配置.js

/*!
 * Module dependencies.
 */

var path = require('path')
var rootPath = path.resolve(__dirname + '../..')

/**
 * Expose config
 */

module.exports = {
  development: {
    root: rootPath,
    db: 'mongodb://localhost/kinoki_dev',
    rootURL:"http://localhost/",
    logger: 'dev'
  },
  test: {
    root: rootPath,
    db: 'mongodb://localhost/kinoki_test',
    rootURL:"http://localhost/",
    port: 9273,
    logger: false
  },
  ci: {
    root: rootPath,
    db: ("mongodb://" + process.env.WERCKER_MONGODB_HOST + ":" + process.env.WERCKER_MONGODB_PORT + "/kinoki_ci"),
    port: 2547,
    rootURL:"http://localhost/",
    logger: false
  },
  production: {
    root: rootPath,
    dbpass:"xyz",
    db: 'mongodb://user:pass@mymongoserver.com:39768/kinoki',
    rootURL:"http://kinokiapp.com/",
    logger: 'dev'
  }
}

配置/express.js

/*!
 * Module dependencies.
 */

var express = require('express')
var mongoStore = require('connect-mongo')(express)
var helpers = require('view-helpers')
var pkg = require('../package')
var flash = require('connect-flash')
var env = process.env.NODE_ENV || 'development'
var config = require("./config")[env]

/*!
 * Expose
 */

module.exports = function (app, config, passport) {
  // Add basic auth for staging
  if (env === 'staging') {
    app.use(express.basicAuth(function(user, pass){
      return 'username' == user & 'password' == pass
    }))

    app.use(function (req, res, next) {
      if (req.remoteUser && req.user && !req.user._id) {
        delete req.user
      }
      next()
    })
  }

  app.set('showStackError', true)

  // use express favicon
  app.use(express.favicon(config.root + '/public/favicon.ico'))

  app.use(express.static(config.root + '/public'))
  if(config.logger){
    app.use(express.logger(config.logger))
  }

  // views config
  app.set('views', config.root + '/app/views')
  app.set('view engine', 'jade')

  app.configure(function () {
    // bodyParser should be above methodOverride
    app.use(express.bodyParser())
    app.use(express.methodOverride())

    // cookieParser should be above session
    app.use(express.cookieParser())
    app.use(express.session({
      secret: pkg.name,
      store: new mongoStore({
        url: config.db,
        collection : 'sessions'
      })
    }))

    // Passport session
    app.use(passport.initialize())
    app.use(passport.session())

    // Flash messages
    app.use(flash())

    // expose pkg and node env to views
    app.locals({
      pkg:pkg,
      env:env
    })

    // View helpers
    app.use(helpers(pkg.name))

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

    // custom error handler
    app.use(function (err, req, res, next) {
      if (err.message
        && (~err.message.indexOf('not found')
        || (~err.message.indexOf('Cast to ObjectId failed')))) {
        return next()
      }

      console.error(err.stack)
      res.status(500).render('500')
    })

    app.use(function (req, res, next) {
      res.status(404).render('404', { url: req.originalUrl })
    })
  })

  // development specific stuff
  app.configure('development', function () {
    app.locals.pretty = true;
  })

  // staging specific stuff
  app.configure('staging', function () {
    app.locals.pretty = true;
  })
}

配置/passport.js

/*!
 * Module dependencies.
 */

var mongoose = require('mongoose')
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy
var User = mongoose.model('User')
var config = require('./config')[process.env.NODE_ENV]

/**
 * Expose
 */

module.exports = function(passport, config) {
  // serialize sessions
  passport.serializeUser(function(user, done) {
    done(null, user.id)
  })

  passport.deserializeUser(function(id, done) {
    User.findOne({
      _id: id
    }, function(err, user) {
      done(err, user)
    })
  })

  passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_ID,
    clientSecret: process.env.GOOGLE_SECRET,
    callbackURL: config.rootURL + 'google/callback'
  },
  function(accessToken, refreshToken, profile, done) {
    User.findOne({
        id: profile.id
      }, function(err, user) {
        if (err) {
          return done(err)
        }
        if (!user) {
          user = new User({
            id: profile.id,
            profile: profile,
            accessToken:accessToken,
            refreshToken:refreshToken
          })
          user.save(function(err) {
            if (err) {
              return done(err)
            }
            done(null, user)
          })
        } else {
          done(null,user)
        }       
      })
  }
))

  passport.reqAuth = function(req,res,next){
    if(req.isAuthenticated())
      return next()
    else
      res.redirect('/login')
  }
}

配置/routes.js

/**
 * Module dependencies.
 */

var mongoose = require('mongoose')
var passportOptions = {
  failureFlash: 'Invalid email or password.',
  failureRedirect: '/login'
}

// controllers
var home = require('home')
var functions = require('function')

/**
 * Expose
 */

module.exports = function (app, passport) {

  console.log("SR");
  app.get('/', function(req,res){
    console.log("//////");
  })
  app.get('/functions/get',functions.get)
  app.post('/functions/submit',functions.sub)
  // app.get('/login',passport.authenticate('google',{
  //    "scope":"https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile",
  //    "hd":"kinokiapp.com"
  // }))
  // app.get('/google/callback',passport.authenticate('google', { failureRedirect:"/" }),function(req,res){
  //    res.end("auth")
  // })

console.log("ER");
}

有谁知道为什么所有路由都返回 404(所有路由都是 404,我只是没有日志)。

如果您需要更多代码,请告诉我。

最佳答案

如果请求到达中间件链的末尾而没有任何内容发送响应,则表示 404。因此,一个常见的原因是缺少 app.use(app.router)

在您的情况下,passport.deserializeUser(id, fn)passport.session() 中抛出错误。 Express 绕过 app.router 将请求直接传递给您的自定义错误处理程序。由于错误不是“未找到”,因此它呈现 404

如果 User.findOne(... 找不到用户,我可能只会返回 null 的用户。您需要确保向已登录和未登录用户显示的任何模板都会处理这两种情况。

我也经常用这个,可能会派上用场:

function restrictToLoggedIn(req, res, next){
  if(req.user && req.user !== null){ 
    return next() 
  } else {
    res.send(401, 'Must be logged in');
  };
};

app.get('/'
, restrictToLoggedIn
, function(req, res, next){
// req.user is guranteed to be populated
  res.locals.user = req.user;
  res.render('home');
});

编辑:将故障排除留给后代...

如果 app.use(app.router) 已经存在于您的 ./config/express 中,请检查之前的中间件。您可以在 routes.js 的顶部设置一个 catchall 路由,以确保任何到达路由器的东西都会发送 200:app.all('*', function(req,res){ res.send(200 , req.originalUrl) });

最后,确认 require('function') 正在正确加载。我总是使用 require('./function.js')

您可以注释掉您的 app.use(passport... 中间件函数来测试它是否有问题。

如果这些都没有帮助,请发布您的 config/* javascript 文件。

关于javascript - Expressjs - 所有路由都是 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406591/

相关文章:

javascript - 带有特殊字符的原型(prototype) $ 和 $$

javascript - ES2015 导出类是否创建闭包?

node.js - rtorrent xml-rpc 命令加载 torrent 并从 Nodejs 获取添加的 torrent 的 id

javascript - 着陆页不断返回 express 中的静态文件

javascript - 表达 router.get() 函数语法错误

javascript - 如何使用套接字 IO 在 Python 客户端和 NodeJS 服务器之间进行通信?

javascript - Angular,获取文本框的动态值到 Controller

javascript - 如何在 Node.JS 和客户端 JS 中重复使用相同的类定义?

javascript - 我如何通过 api 获取大量用户?使用 async wait

node.js - mongodb/mongoose 使聚合 $lookup 成为可选的