未定义 post 主体变量

Undefined post body variable

我在 NodeJS 中有以下 login/sign up API。到目前为止,除了登录路径之外的所有内容都在工作。每当我尝试使用现有的用户名和密码登录时,我都会收到以下错误:

Cannot read property 'username$#39; from undefined

错误在 api.js 的这个位置触发:username: req.body.username

知道当我执行 req.body 的控制台日志时,我得到的输出是 undefined

下面是我的服务器和 api javascript 文件,我希望这些足以让您了解我的代码有什么问题。如果需要找到解决方案,我可以提供更多代码。

仅供参考:我是根据教程学习​​的,所以请假设我对此事没有深入的了解。

server.js

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

mongoose.connect(config.database, function(err){
    if(err){
        console.log(err);
    }
    else {
        console.log('Connected to the database');
    }
});

app.use(bodyParser.urlencoded({
    extended: true
}));

app.use(bodyParser.json());
app.use(morgan('dev'));

// Front end API
app.use(express.static(__dirname + '/public'));

// Middleware API
var api = require('./app/routes/api')(app, express);
app.use('/api', api);

app.get('*', function(req, res){
    res.sendFile(__dirname + "/public/app/views/index.html");
});

app.listen(config.port, function(err){
    if(err){
        console.log(err);
    }
    else {
        console.log("Listening on port " + config.port);
    }
});

api.js

var User = require("../models/users"),
    Story = require("../models/story"),
    config = require("../../config"),
    secretKey = config.secretKey,
    jsonwebtoken = require("jsonwebtoken");

function createToken(user){
    var token = jsonwebtoken.sign({
        id: user._id,
        name: user.name,
        username: user.username
    }, secretKey, {
        expirationMinute: 1440
    });

    return token;
}

module.exports = function(app, express){
    var api = express.Router();

    api.post('/signup', function(req, res){
        var user = new User({
            name: req.param.name,
            username: req.body.username,
            password: req.body.password
        });

        user.save(function(err){
            if(err){
                res.send(err);
                return;
            }
            res.json({message: 'User has been created!'});
        });
    });

    api.get('/users', function(req, res){
        User.find({}, function(err, users){
            if(err){
                res.send(err);
                return;
            }
            res.json(users);
        });
    });

    api.post('/login', function(res, req){
        console.log(req.body);
        User.findOne({
            username: req.body.username
        }).select('password').exec(function(err, user){
            if(err){
                throw err;
            }
            if(!user){
                res.send({message: "User does not exist"});
            }
            else if(user){
                var validPassword = user.comparePassword(req.body.password);

                if(!validPassword){
                    res.send({
                        message:"Invalid Password"
                    });
                }
                else {
                    // Token
                    var token = createToken(user);

                    res.json({
                        success: true,
                        message: "Successful login",
                        token: token
                    });
                }
            }
        });
    });

    api.use(function(req, res, next){
        console.log("Somebody just came to our api");

        var token = req.body.token || req.param('token') || req.headers['x-access-token'];

        // check if does not exist
        if(token){
            jsonwebtoken.verify(token, superSecret, function(err, decoded){
                if(err){
                    res.status(403).send({
                        success: false,
                        message: "Failed to authenticate user"
                    });
                }
                else {
                    req.decoded = decoded;
                    next();
                }
            });
        }
        else {
            res.status(403).send({
                success: false,
                message: 'No token provided'
            });
        }
    });

    api.route('/')
        .post(function(req, res){
            var story = new Story({
                creator: req.decoded.id,
                content: req.body.content
            });

            story.save(function(err){
                if(err){
                    res.send(err);
                    return;
                }
                res.json({message: "New Story Created"});
            })
        })
        .get(function(req, res){
            Story.find({
                creator: req.decoded.id
            }, function(err, stories){
                if(err){
                    res.send(err);
                    return;
                }
                res.json(stories);
            });
        });

    api.get('/me', function(req, res){
        res.json(req.decoded);
    });

    return api;
}

api.post('/login', function(res, req){ 行中,resreq 颠倒了。

应该是:

api.post('/login', function(req, res) {
    ...
});