2016-04-29 64 views
0

我是MEAN堆棧的新手,無法通過http.post發送註冊數據。POST http:// localhost:3000/api /註冊400(錯誤請求)

這裏是我的服務器代碼:

var express = require('express'), 
    bodyParser = require('body-parser'), 
    methodOverride = require('method-override'), 
    errorHandler = require('express-error-handler'), 
    morgan = require('morgan'), 
    routes = require('./routes'), 
    api = require('./routes/api'), 
    http = require('http'), 
    path = require('path'), 
    usersController = require('./public/js/userscontroller.js'); 

var app = module.exports = express(); 

var mongoose = require('mongoose'); 
var connection = require('./config/database')(mongoose); 
var models = require('./models/models')(connection); 
var cons = require('consolidate'); 


/** 
* Configuration 
*/ 

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.engine('html', cons.swig); 
app.set('view engine', 'html'); 
app.use(morgan('dev')); 
app.use(bodyParser.json()); 
app.use(methodOverride()); 
app.use(express.static(path.join(__dirname, 'public'))); 

var env = process.env.NODE_ENV || 'development'; 

// development only 
if (env === 'development') { 
    app.use(errorHandler()); 
} 

// production only 
if (env === 'production') { 
    // TODO 
} 


/** 
* Routes 
*/ 

// serve index and view partials 
app.get('/', routes.index); 
app.get('/partials/:name', routes.partials); 

// JSON API 
app.post('/api/signup', api.signup); 

// redirect all others to the index (HTML5 history) 
app.get('*', routes.index); 


/** 
* Start Server 
*/ 

http.createServer(app).listen(app.get('port'), function() { 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

這裏是我的API:

/* 
* Serve JSON to our AngularJS client 
*/ 
var User = require('../models/user'); 


exports.name = function (req, res) { 
    res.json({ 
    name: 'Bob' 
    }); 
}; 


exports.signup = function (req, res, next){ 
    console.log("in signup in API"); 
    if(!req.body.username || !req.body.password){ 
     return res.status(400).json({message: 'Please fill out all feelds'}); 
    } 
    var user = new User(); 
    user.username = req.body.username; 
    user.setPassword(req.body.password); 
    console.log("after set password"); 
    user.save(function(err, result) { 
     if(err){return next(err); } 
     res.json(result); 
    }); 
}; 

這裏是我的客戶端JS app.js:

'use strict'; 

// Declare app level module which depends on filters, and services 

angular.module('myApp', [ 
    'myApp.controllers', 
    'myApp.filters', 
    'myApp.services', 
    'myApp.directives', 
    'ngResource' 
]). 
config(function ($routeProvider, $locationProvider) { 
    $routeProvider. 
    when('/view1', { 
     templateUrl: 'partials/partial1', 
     controller: 'usersController' 
    }). 
    when('/view2', { 
     templateUrl: 'partials/partial2', 
     controller: 'usersController' 
    }). 
    otherwise({ 
     redirectTo: '/view1' 
    }); 

    $locationProvider.html5Mode(true); 
}). 
factory('auth', ['$http', '$window', function($http, $window, auth){ 
    var auth = {}; 

    //saves token 
    auth.saveToken = function (token){ 
    $window.localStorage['nicerpg-token'] = token; 
    }; 

    //Attempts to register the user 
    auth.signup = function(user){ 
    console.log(user); 
    $http({ 
     method: "POST", 
     url: "/api/signup", 
     headers: {"Content-Type": "application/json"} 
    }); 
    // return $http.post('/api/signup', user).success(function(data){ 
    // //auth.saveToken(data.token); 
    // }); 
    }; 

    return auth; 
}]); 

最後,在這裏是controllers.js:

'use strict'; 

/* Controllers */ 

angular.module('myApp.controllers', []). 
    controller('AppCtrl', function ($scope, $http) { 

    $http({ 
     method: 'GET', 
     url: '/api/name' 
    }). 
    success(function (data, status, headers, config) { 
     $scope.name = data.name; 
    }). 
    error(function (data, status, headers, config) { 
     $scope.name = 'Error!'; 
    }); 

    }). 
    controller('usersController', ['$scope', '$resource', 'auth', function ($scope, $resource, auth) { 
    // write Ctrl here 
    var User = $resource('/api/users'); 
    var Signup = $resource('/signup'); 

     //Gets all the users 
    User.query(function(results) { 
     //console.log(results); 
     $scope.users = results; 
    }); 

    $scope.signup = function(){ 
     auth.signup($scope.registerform); 

     // .error(function(error){ 
     // console.log(error); 
     // $scope.error = error; 
     // }).then(function(){ 
     // }); 

     User.query(function(results) { 
     // console.log(results); 
     $scope.users = results; 
     }); 
     $scope.registerform = ''; 

    }; 

    }]); 

當我把localhost:3000/api /註冊到我的瀏覽器時,我得到了預期的缺失字段響應;但是,當我嘗試使用http.post運行代碼時,它將返回400錯誤的請求。我已經嘗試過多次改變了http標頭內容類型,但沒有運氣,還有許多其他解決方案沒有成果。請幫我:(

謝謝!

+0

因此,您從POST獲得的不良請求沒有{message:'請填寫所有感覺'}身體?原因從您的後端代碼看起來很正常,您會收到一個400電話 – rick

回答

0

指定數據對象,如下

data: { 
 
         username: "demo", 
 
         password: "password" 
 
}

這應該可以解決您的issue.But你AUTH方法不哈發起ajax呼叫。如果由於錯誤憑據導致調用失敗,那麼您的控制器仍然繼續並執行User.query,這不是預期的行爲。