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

时间:2014-04-23 21:18:15

标签: javascript node.js angularjs post express

我试图将客户端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参数没有通过?

2 个答案:

答案 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.bodyreq.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);
});