【问题标题】:Data is not passed from AngularJS controller to NodeJS server数据不会从 AngularJS 控制器传递到 NodeJS 服务器
【发布时间】:2014-06-08 22:32:39
【问题描述】:

我正在尝试将一些值从我的客户端 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" },当通过$.param($scope.user) 传递时,计算结果为name=john&email=doe。本来以为问题出在请求的content-type上,原来是一个JSON对象。在阅读了类似的问题后,我将 content-type 更改为 x-www-form-urlencoded,但仍然无法从 POST 请求中获取数据。

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

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

我知道正在访问服务器端脚本,因为我可以打印出 req.method 等数据,但尝试打印 req.params 只会得到 { }。

为什么我的 POST 参数没有通过?

【问题讨论】:

    标签: javascript node.js angularjs post express


    【解决方案1】:

    由于您使用的是 express.js,因此您的 POST 字段是作为正文而不是 URL 的一部分接收的,因此您需要使用 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);
    });
    

    【讨论】:

      【解决方案2】:

      请求正文不会保存到req.params。您需要添加一个中间件来为您解析请求正文。 req.params 用于作为 URL 一部分提供的 key=value 对(例如,发布到“/foo/bar?baz=bla”将导致 req.params.baz === 'bla')。

      一些示例解决方案:

      • body-parser - 仅解析 application/jsonapplication/x-www-form-urlencoded 请求正文。

      • formidable - 解析 application/jsonapplication/x-www-form-urlencodedmultipart/form-data强>。这是 Express 3 的正文解析器中使用的内容。我不确定 Express 4 中是否有“官方”Express 中间件。

      • busboy - 解析 application/x-www-form-urlencodedmultipart/form-data。它不会将文件保存到磁盘本身,而是将文件呈现为可读流。 API 不同于强大的(来自 Express 3 的 /body 解析器)。 busboy 可以使用一些 Express 中间件:

        • connect-busboy - 一个瘦包装器,仅在您的 req 上设置一个 Busboy 实例。您可以将其设置为自动开始解析请求,也可以在要开始时手动将请求通过管道传递给req.busboy

        • multer - 提供更类似于 Express 3 正文解析器中间件的接口(带有req.bodyreq.files 集)。

        • reformed - 一个新模块,它在 Busboy 之上提供了一个层,以提供类似于强大的机制(例如将上传的文件保存到磁盘)以及字段验证等其他功能。

          李>

      【讨论】:

      • 这让我找到了正确的答案。我不得不使用 connect.parseBody,因为之前没有安装 express 包,而且我在安装时遇到了麻烦。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多