2016-03-30 10 views
0

チュートリアルから、私はanglejsのボタンをクリックして私のエンドポイントに投稿するようにアプリケーションを設定しました。チュートリアルでは動作しますが、私にとってはうまくいきません。 Angular Post Requestに未定義のプロパティ 'username'を読み取ることができません

if (!(req.body.username === 'john.doe' && req.body.password === 'foobar')) {

は、問題のあるラインに

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部分

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's 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です、ログインボタンを押し経由で呼び出され

<button class="btn waves-effect waves-light" ng-click="loginUser()">Submit 
    <i class="material-icons right">send</i> 
</button> 
+0

することができます 'はconsole.log(req.body)'を参照してください? – Rayon

答えて

1

あなたはreq.bodyにアクセスするためにbodyParserを使用する必要があります。

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/en/api.html

+0

ありがとうございました。私は、コードスニペットに含まれているすべてのインクルードを超長時間にするために、インクルードを追加したくありませんでした。 –

+0

@NatuMyersエラーは、req.bodyが定義されていないことです。だから、私はクライアントアプリケーションではなく、serverappの問題だと思う。あなたは "//すべてのインクルード...."コードを提供できますか? –

+0

@ NatuMyersというコードを実行しようとしませんでした。このように、私はあなたが持っている正確なエラーを認識していません。 user1280859が正しいかもしれません。 – Tacocat

1
コード内のコメントを1として

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

は、コード入力の検証を欠いています。 'username'が定義されていないため、エラーCannot read property 'username' of undefined for Angular Post Requestが表示されます。 'should probably return some sort of error code':エラーコード404と、このようないいえ」などの関連するエラーメッセージを表示してJSONレスポンスを送信するユーザーがPOSTリクエストのために必要な入力を提供していることを確認し、すなわち

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

推敲する必要が

ユーザー名が指定されました。 「パスワードは指定されていません。

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、これで問題は解決しますか? – Tacocat

+0

@Natu Myersの場合は、ルータのスペルミスがないことを確認する必要があります。つまり、パラメータの名前は「username」と「password」です。 – Tacocat

+0

ありがとう、私の問題(同じエラー)を解決しませんが、それは役に立ちます。何らかの理由で、角度がユーザー名の入力を提供したにもかかわらず、ユーザー名 –

関連する問題