Не удалось прочитать свойство 'username' из неопределенного для Angular Post Request

0

Из учебника я настроил свое приложение для публикации в конечной точке одним нажатием кнопки в angularjs. В учебнике это работает, но для меня это не работает.

if (!(req.body.username === 'john.doe' && req.body.password === 'foobar')) { Является ли проблема проблемой

serverapp.js

// LOAD ---- ---- ---- ----
var fs = require('fs');
var https = require('https');

var HTTPS_PORT = process.env.PORT || 3111;
var port = process.env.PORT || 3000;

var express = require('express');
var bodyParser = require('body-parser');
var Sequelize = require('sequelize');
var epilogue = require('epilogue');
var app = express();

var router = express.Router();
var morgan = require('morgan'); // log requests to the console (express4)
var bodyParser = require('body-parser'); // pull information from HTML POST (express4)
var methodOverride = require('method-override'); // simulate DELETE and PUT (express4)


var expressJwt = require('express-jwt'); //https://npmjs.org/package/express-jwt
var secret = 'this is the secret secret secret 12356';
var jwt = require('jsonwebtoken');  //https://npmjs.org/package/node-jsonwebtoken


// We are going to protect /api routes with JWT
app.use('/api', expressJwt({
    secret: secret
}));


app.use('/', express.static(__dirname + '/'));


// if there ever an unauth error, we redirect them
app.use(function(err, req, res, next) {
    if (err.constructor.name === 'UnauthorizedError') {
        res.status(401).send('Unauthorized :(');
    }
});


app.post('/authenticate', function (req, res) {
  //TODO validate req.body.username and req.body.password
  //if is invalid, return 401
  if (!(req.body.username === 'john.doe' && req.body.password === 'foobar')) {
    res.status(401).send('Wrong user or password');
    return;
  }

  var profile = {
    first_name: 'John',
    last_name: 'Doe',
    email: '[email protected]',
    id: 123
  };

  // We are sending the profile inside the token
  var token = jwt.sign(profile, secret, { expiresInMinutes: 60*5 });

  res.json({ token: token });
});


// ...MODELS, relations, rest endpoints and all that crap withheld from stack overflow

        app.get('/api/restricted', function(req, res) {
            console.log('user ' + req.body.username + ' is calling /api/restricted');
            res.json({
                name: 'foo'
            });
        });

clientapp.js

myApp.controller('userController', function ($scope, $http, $window) {
  $scope.user = {username: 'thisshouldbeempty', password: 'thisshouldbeempty'};
  $scope.isAuthenticated = false;
  $scope.welcome = '';
  $scope.message = '';

  $scope.loginUser = function () {

    $http
      .post('/authenticate', $scope.user)

      .success(function (data, status, headers, config) {
        $window.sessionStorage.token = data.token;
        $scope.isAuthenticated = true;
        var encodedProfile = data.token.split('.')[1];
        var profile = JSON.parse(url_base64_decode(encodedProfile));
        $scope.welcome = 'Welcome ' + profile.first_name + ' ' + profile.last_name;
      })
// etc....

html partial, логин вызывается нажатием кнопки

<button class="btn waves-effect waves-light"   ng-click="loginUser()">Submit
    <i class="material-icons right">send</i>
</button>
  • 0
    Можете ли вы console.log(req.body) ?

2 ответа

1
Лучший ответ

Вы должны использовать bodyParser для доступа к req.body:

var app = require('express')();
var bodyParser = require('body-parser');
var multer = require('multer'); // v1.0.5
var upload = multer(); // for parsing multipart/form-data

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded

app.post('/profile', upload.array(), function (req, res, next) {
  console.log(req.body);
  res.json(req.body);
});

См. Http://expressjs.com/ru/api.html

  • 0
    Спасибо, но да, я просто не хотел добавлять все включения в фрагмент кода, чтобы сделать мой пост очень длинным
  • 0
    @NatuMyers Вы получаете ошибку, что req.body не определено. Поэтому я думаю, что проблема в serverapp, а не в клиентском приложении. Можете ли вы предоставить код "// ALL INCLUDES ...."?
Показать ещё 4 комментария
1

Согласно комментарию в коде:

//TODO validate req.body.username and req.body.password

В коде отсутствует проверка ввода. Вы получаете ошибку. Cannot read property 'username' of undefined for Angular Post Request поскольку "имя пользователя" не определено.

Вам нужно проверить, что пользователь предоставил необходимые для почтового запроса данные, то есть

if(!req.body.username || !req.body.password)
    return; // should probably return some sort of error code

Выработка: 'should probably return some sort of error code': отправить ответ JSON с кодом ошибки 404 и соответствующее сообщение об ошибке, такое как "Нет имени пользователя". и "Не указан пароль".

например

if(!req.body.username) {
    res.status(404).send('No username specified');
    return;
}

if(!req.body.password) {
    res.status(404).send('No password specified');
    return;
}
  • 0
    @Natu Myers, это решает твою проблему?
  • 0
    @Natu Myers, вы также должны проверить свой роутер, чтобы убедиться в отсутствии орфографических ошибок, т.е. параметры правильно названы 'username' и 'password' соответственно.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню