数据不会从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 / json和application / x-www-form-urlencoded请求体。
-
强大 – parsingapplication / json , application / x-www-form-urlencoded和multipart / form-data 。 这是在Express 3的身体分析器中使用的。我不确定是否有Express 4的“官方”Express中间件。
-
busboy – parsingapplication / x-www-form-urlencoded和multipart / form-data 。 它不会将文件保存到磁盘本身,而是将文件呈现为可读stream。 这个API不同于强大的(Express 3的/ bodyparsing器)。 有几个Express中间件可用于busboy:
-
connect-busboy – 一个简单的包装器,只需要在你的
req
上设置一个Busboy实例。 您可以将其设置为自动开始分析请求,也可以在要启动时手动将请求传送到req.busboy
。 -
multer – 提供了一个更类似于Express 3 body parser中间件的接口(用
req.body
和req.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); });