数据不会从AngularJS控制器传递到NodeJS服务器

我试图从我的客户端AngularJS脚本传递一些值到服务器端NodeJS脚本。 我这样设置POST请求:

$scope.addUser = function() { console.log($.param($scope.user)); $http({ method: 'POST', url: '/addUser', data: $.param($scope.user), headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }). success( function(response) { console.log("success"); }). error( function(response) { console.log("error"); }); }; 

$ scope.uservariables是{ name: "john", email: "doe" } ,当通过$.param($scope.user)传递时,它的计算结果为name=john&email=doe 。 我原本以为问题是请求的内容types,最初是一个JSON对象。 在阅读了类似的问题之后,我把内容types改为了x-www-form-urlencoded,但仍然无法从POST请求中获取数据。

这里是服务器端的NodeJS脚本,它是用POST请求命中的:

 app.post('/addUser', function(req, res) { console.log(req.params); }); 

我知道正在达到服务器端脚本,因为我可以打印出诸如req.method之类的数据,但试图仅以{}方式打印req.params结果。

为什么我的POST参数不能通过?

请求正文不保存到req.params 。 您需要添加一个中间件来为您parsing请求主体。 req.params是作为URL的一部分提供的key=value对(例如POST到“/ foo / bar?baz = bla”会导致req.params.baz === 'bla' )。

一些示例解决scheme

  • body-parser – 仅parsingapplication / jsonapplication / x-www-form-urlencoded请求体。

  • 强大 – parsingapplication / jsonapplication / x-www-form-urlencodedmultipart / form-data 。 这是在Express 3的身体分析器中使用的。我不确定是否有Express 4的“官方”Express中间件。

  • busboy – parsingapplication / x-www-form-urlencodedmultipart / form-data 。 它不会将文件保存到磁盘本身,而是将文件呈现为可读stream。 这个API不同于强大的(Express 3的/ bodyparsing器)。 有几个Express中间件可用于busboy:

    • connect-busboy – 一个简单的包装器,只需要在你的req上设置一个Busboy实例。 您可以将其设置为自动开始分析请求,也可以在要启动时手动将请求传送到req.busboy

    • multer – 提供了一个更类似于Express 3 body parser中间件的接口(用req.bodyreq.files设置)。

    • 改革 – 一个新的模块,在Busboy之上提供一个层,提供类似于强大的机制(例如,保存上传的文件到磁盘),但也有其他function,如字段validation。

由于您使用的是express.js,您的POST字段是作为body的一部分而不是URL接收的,所以您需要使用body而不是params

 app.post('/addUser', function(req, res) { console.log(req.body);//also possible req.body.name | req.body.email }); 

如何尝试一个简单的POST这样的事情( 用于testing目的):

  $http.post('/addUser',{ "name": "john", "email": "doe" }).success(function(response) { console.log("success"); }).error(function(err){ console.log("failure") }); 

请注意,参数被用作URL参数。 像这样的东西:

 app.get('/addUser/:userID', function(req, res) { console.log(req.params.userID); });