数据没有从AngularJS控制器传递到NodeJS服务器

Data is not passed from AngularJS controller to NodeJS server

本文关键字:NodeJS 服务器 控制器 AngularJS 数据      更新时间:2023-09-26

我正试图将一些值从客户端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。我最初认为问题在于请求的内容类型,它最初是一个JSON对象。在阅读了类似的问题后,我将内容类型更改为x-www-form-urlencoded,但仍然无法从POST请求中获取数据。

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

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

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

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

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

一些示例解决方案:

  • body解析器-仅解析application/jsonapplications/x-www-form-urlencoded请求体。

  • 强大-解析application/jsonapplications/x-www-form-urlencoded多部分/表单数据。这就是Express3中的主体解析器中使用的内容。我不确定Express4是否有"官方"的Express中间件。

  • busboy-解析应用程序/x-www-form-urlencoded多部分/表单数据。它不将文件保存到磁盘本身,而是将文件显示为可读流。API不同于强大的(/来自Express3的body解析器)。有一些Express中间件可用于busboy:

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

    • multer-提供了一个更类似于Express3主体解析器中间件的接口(设置了req.bodyreq.files)。

    • reformed-一个新模块,在Busboy的顶部提供一层,以提供类似于强大的机制(例如将上传的文件保存到磁盘),但也提供其他功能,如现场验证。

由于您使用的是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);
});