我试图将客户端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.user变量为{ name: "john", email: "doe" }
,并在通过name=john&email=doe
时评估为$.param($scope.user)
。我原本以为问题是请求的内容类型,它最初是一个JSON对象。在阅读了类似问题之后,我将内容类型更改为x-www-form-urlencoded,但仍然无法从POST请求中获取数据。
以下是使用POST请求命中的服务器端NodeJS脚本:
app.post('/addUser', function(req, res) {
console.log(req.params);
});
我知道正在访问服务器端脚本,因为我可以打印出req.method等数据,但是尝试打印req.params只会导致{}。
为什么我的POST参数没有通过?
答案 0 :(得分:1)
请求正文未保存到req.params
。您需要添加一个中间件来为您解析请求主体。 req.params
用于作为网址一部分提供的key=value
对(例如,发布到" / foo / bar?baz = bla"会产生req.params.baz === 'bla'
)。
一些示例解决方案:
body-parser - 仅解析 application / json 和 application / x-www-form-urlencoded 请求正文。
formidable - 解析 application / json , application / x-www-form-urlencoded 和 multipart / form-data 即可。这是Express 3中的身体解析器中使用的内容。我不确定是否有#34;官方"为Express 4提供Express中间件。
busboy - 解析 application / x-www-form-urlencoded 和 multipart / form-data 。它不会将文件保存到磁盘本身,而是将文件显示为可读流。 API与强大的(/ Body 3的/ body解析器)不同。有一些Express中间件可用于busboy:
connect-busboy - 一个仅在req
上设置Busboy实例的瘦包装器。您可以将其设置为自动开始解析请求,或者您可以在要启动时手动将请求发送到req.busboy
。
multer - 提供更类似于Express 3正文解析器中间件的界面(设置req.body
和req.files
)。
reformed - 一个新模块,在Busboy之上提供一个层,提供类似强大的机制(例如将上传的文件保存到磁盘),还有其他功能,如字段验证。
答案 1 :(得分:0)
由于您使用的是express.js,因此您的POST字段是作为正文的一部分而不是网址接收的,因此您需要使用body
代替params
:
app.post('/addUser', function(req, res) {
console.log(req.body);//also possible req.body.name | req.body.email
});
如何尝试更简单的POST这样的事情(仅用于测试目的 ):
$http.post('/addUser',{ "name": "john", "email": "doe" }).success(function(response) {
console.log("success");
}).error(function(err){
console.log("failure")
});
请注意,Params用作URL参数;像这样的东西:
app.get('/addUser/:userID', function(req, res) {
console.log(req.params.userID);
});