Node JS Json web令牌Router.use()需要中间件函数但是未定义

时间:2016-02-27 16:14:43

标签: javascript json node.js express

在Node JS中创建一个登录类型的东西,并尝试使用JSON令牌。这是server.js:

// dependancies
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var morgan = require('morgan');
var mongoose = require('mongoose');
var passwordHash = require('password-hash');

var jwt = require('jsonwebtoken');
var config = require('./config');
var User = require('./app/models/user');

// config

var port = process.env.PORT || 8080;
mongoose.connect(config.database);
app.set('superSecret', config.secret);

// body parser
app.use(bodyParser.urlencoded({
  extended: false
}));
app.use(bodyParser.json());

// morgan
app.use(morgan('dev'));

//routes
app.get('/', function(req, res) {
  res.send('Hello! The API is at http://localhost:' + port + '/api');
});

app.get('/setup', function(req, res) {
  var hashedPassword = passwordHash.generate('catsanddogs');
  var tommy = new User({
    user: 'Tommy Birt',
    password: hashedPassword,
    admin: false,
    MP: true,
    Position: true
  });
  // save
  tommy.save(function(err) {
    if (err) throw err;

    console.log('Saved');
    res.json({
      success: true
    });
  });
});

// API routes
var apiRoutes = express.Router();

apiRoutes.get('/', function(req, res) {
  res.json({
    message: 'Welcome to this api.'
  });
});


apiRoutes.post('/authenticate', function(req, res) {
  // Fine user
  User.findOne({
    user: req.body.user
  }, function(err, user) {
    // general error...
    if (err) throw err;

    // incorrect
    if (!user) {
      res.json({
        success: false,
        message: 'Authentication failed: No user'
      });
    } else if (user) {
      if (!passwordHash.verify(req.body.password, user.password)) {
        res.json({
          success: false,
          message: 'Authentication failed: Incorrect Password'
        });
      } else {
        // token!
        var token = jwt.sign(user, app.get('superSecret'), {
          expiresIn: 64000
        });

        res.json({
          success: true,
          message: 'Enjoy your token!',
          token: token
        });
      }
    }
  })
});
app.use('/api', apiRoutes);

apiRoutes.use(function(req, res, next) {
  // Lets find our token!
  var token = req.body.token || req.query.token || req.headers['x-access-token'];

  // Have we found it?
  if (token) {
    // Verify! No crackers please
    jwt.verify(token, app.get('superSecret'), function(err, decoded) {
      if (err) {
        // Somethings gone wrong...
        return res.json({
          sucess: false,
          message: 'Failed to authenticate token'
        });
      } else {
        // No errors! Yay :)
        req.decoded = decoded
        next();
      }
    });
  } else {
    // No token Sir! Get off this train!
    return res.satus(403).send({
      success: false,
      message: 'Stop cheating'
    });
  }
});

apiRoutes.use('/bank', bankRoutes);

var bankRoutes = express.Router();
bankRoutes.get('/balance', function(req, res) {
  res.send("Welcome to your balance!");
});

// lets roll
app.listen(port);
console.log('We have taken off at http://localhost' + port);

基本上,每当我运行时,没有导航到任何东西,它抛出了这个错误:typeError:Router.use()需要中间件函数但是未定义。

发生了什么事?为什么会抛出这个错误?

1 个答案:

答案 0 :(得分:2)

问题可能出在您的bankRoutes -

apiRoutes.use('/bank', bankRoutes);

var bankRoutes = express.Router();
bankRoutes.get('/balance', function(req, res) {
  res.send("Welcome to your balance!");
});

在定义之前,您正在调用bankRoutes

所以改变它(首先定义它而不是使用它) -

var bankRoutes = express.Router();
bankRoutes.get('/balance', function(req, res) {
  res.send("Welcome to your balance!");
});

apiRoutes.use('/bank', bankRoutes);