2013-05-23 4 views
1

J'essaie d'apprendre Express/NodeJS, je travaille avec ide c9. Pour utiliser le cadre de passeport pour l'authentification, je tente de mettre en œuvre un formulaire de connexion très simple, mais lorsque je tente d'envoyer mes informations de connexion à mon serveur, il reçoit les données comme ceci:Express angulaire - JSON étrange recevoir de POST

{ '{"username":"login","password":"pwd"}': '' } 

au lieu des données que je me connecte avant d'envoyer:

OBJECT {username: "login", password: "pwd"}

Et JSLint m'a dit que c'est un JSON valide, pourquoi il est envoyer comme clé de l'attribut de l'objet JSON?

Ceci est mon serveur Express:

var application_root = __dirname, 
express = require("express"), 
path = require("path"), 
mongoose = require('mongoose'); 

var app = express(); 
mongoose.connect('mongodb://' + process.env.IP + '/database'); 
app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 

    var allowCrossDomain = function(req, res, next) { 
     res.header("Access-Control-Allow-Origin", "*"); 
     res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS"); 
     res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); 

     if ('OPTIONS' == req.method) { 
      res.send(200); 
     } else { 
      next(); 
     } 
    }; 

    app.use(allowCrossDomain); 
    app.use(app.router); 
    app.use(express.static(path.join(application_root, "public"))); 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.post('/login', function(req, res, next){ 
    var obj = req.body; 
    console.log(obj); 
}); 

app.listen(process.env.PORT, process.env.IP); 

Ceci est mon formulaire HTML:

<div> 
    Username : 
    <input ng-model="user.username"/> 
    Password : 
    <input type="password" ng-model="user.password"/> 
    <div class="button" ng-click="login()">Login</div> 
</div> 

Ceci est mon code AngularJS:

var app = angular.module('app', []).config(function($locationProvider, $routeProvider, $httpProvider) { 

$routeProvider 
    .when('/', { 
     templateUrl: '/partials/home.html', 
     controller : 'HomeCtrl' 
    }) 
    .otherwise({ 
     redirectTo: '/' 
    }); 

$locationProvider.html5Mode(true); 
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; 
$httpProvider.defaults.withCredentials = true; 

}).controller('HomeCtrl', function($scope, $http) { 

    $scope.login = function() { 
     $http.post('http://website.io/login', $scope.user).success(function(data) { 
      console.log(data); 
     }); 
    }; 
}) 

Il est probablement un problème simple, mais mon cerveau se fige maintenant ... Désolé pour mon anglais et je vous remercie d'avance.

+0

Je ne suis pas sûr mais je pense que c'est: $ httpProvider.defaults.headers.post ['Contenu -Type '] =' application/x-www-forme-urlencoded; charset = utf-8 '; mais application/json n'envoie rien à mon serveur ... – Electron

Répondre

0

essayez de poster angular.toJson ($ scope.user);

Je pense qu'il est parce qu'il est un objet angulaire enveloppé

+0

on ne sait pas si c'est emballé – Ven

+0

Le get c'est indéfini pour mon objet. J'ai la même forme pour une API de Restlet et elle a reçu le JSON correctement. – Electron

+0

Merci encore pour la réponse mais ce n'est toujours pas ça, j'essaye quelques méthodes pourJson parseJson json stringify, mais pas un travail pour moi .. peut-être un domaine croisé avec un en-tête de type de contenu incorrect? Je ne trouve pas ^^ – Electron

0

J'ai le même problème, mais vous pourriez déjà résoudre ce problème Je viens fixé par l'option d'utilisation TransformRequest

comme celui-ci

var transform = function(data){ 
    return $.param(data); 
} 

$http.post("/foo/bar", requestData, { 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
    transformRequest: transform 
}).success(function(responseData) { 
    //do stuff with response 
}); 

J'ai trouvé à partir de ce link