【问题标题】:HTTP POST is submitting empty JSON arrayHTTP POST 正在提交空 JSON 数组
【发布时间】:2014-07-18 14:35:38
【问题描述】:
$scope.submitBracket = function(item, event){
    console.log("submitting form");
    var jsonData = '{"userEmail" : "darwood@mail.com","brackets" :' +     JSON.stringify($scope.allGames) + '}';
    var testJSON = {"Hello": {"id": "file", "value": "WTF"}};
    console.log(jsonData);
    var responsePromise = $http.post("/api/brackets", jsonData, {});
    responsePromise.success(function(dataFromServer,status,headers,config){
    console.log(dataFromServer);
});
responsePromise.error(function(data,status,headers,config){
    console.log(data);
    });

}

我正在开发一个 MEAN 堆栈应用程序,它有一个向 MongoDB 提交 JSON 对象的表单。 JSON 是有效的。它可以毫无问题地手动提交到数据库。在上面的代码示例中,我可以看到对象在通过 HTTP 帖子发送到数据库之前被输出到控制台,该 HTTP 帖子被传递到快速路由。奇怪的是,我让它工作,然后在测试中从数据库中删除记录以输入新记录,它开始提交一个带有空数组的 JSON 对象。有时它会抛出“空响应消息,但 POST 请求确实得到了 200 响应。我一生都无法弄清楚为什么数据没有被传递。

如果在 Angular 端也尝试过这个替代功能来发送数据:

$scope.createBracket = function() {
var jsonData = '{"userEmail" : "darwood@mail.com","brackets" :' +     JSON.stringify($scope.allGames) + '}';
    $http.post('/api/brackets', jsonData)
        .success(function(data) {
        $scope.brackets = data;
        $location.path('/');
    })
    .error(function(data) {
        console.log('Error: ' + data);
    });

};

这是它被传递到的快速路线。

app.post('/api/brackets', function(req, res) {

    // create a Bracket
    Bracket.create({
        text : req.body.text,
        done : false
    }, function(err, Bracket) {
        if (err)
            res.send(err);

    });

});

使用 Postman 使用原始 JSON 进行测试时。它挂了很长时间,并说请求正在等待。此代码是根据此处找到的教程建模的

http://scotch.io/tutorials/javascript/creating-a-single-page-todo-app-with-node-and-angular

我已启动并运行此示例代码,并将其插入到我的数据库中没有问题。

我被难住了。任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: node.js angularjs express mongoose mean-stack


    【解决方案1】:

    您是如何手动将 JSON 对象发送到 MongoDB 的?是使用命令行还是使用 Robomongo 之类的工具?

    我会尝试以下方法。 没有 1. 我们到底要向服务器发送什么?

    $scope.createBracket = function() {
    var jsonData = '{"userEmail" : "darwood@mail.com","brackets" :' +      
           JSON.stringify($scope.allGames) + '}';
    
    console.info("In Controller-> jsonData = " + JSON.stringify(jsonData)); //**TEST**
    //Is jsonData shown as expected?    
    
    $http.post('/api/brackets', jsonData)
    
        .success(function(data, status, headers, config) {
        $scope.brackets = data;
        console.info("Status: " + status);
        console.info("Data: " + data);
        console.info("Config: " + JSON.stringify(config));
        //$location.path('/');                        
      })
    
      .error(function(data) {
        console.log('Error: ' + data);
        });
    

    否 2。我们是否在服务器上获取 POST REQ 数据?

    app.post('/api/brackets', function(req, res) {
    console.info("Body: " + JSON.stringify(req.body));        //TEST
    console.info("Text: " + JSON.stringify(req.body.text));   //TEST
    console.info("Done: " + JSON.stringify(req.body.done));   //TEST    
    //Have we got the data from the client?
    //If so need to check Mongoose Schema/Model MongoDB settings etc
    
    //create a Bracket
    //I take it you are using Mongoose and Bracket is the name of the Mongoose Model?
    //
    Bracket.create({
        text : req.body.text,
        done : false
    }, function(err, bkt)  //I would remove Bracket from fn argument as its your Mongoose M
                           //model name
    {
        if (err)
            res.send(err);
    });
    });
    

    【讨论】:

    • 我尝试了这两个步骤。第 2 步:req.body 填充了预期的完美格式的 JSON 文档以进入 MongoDB,req.body.text 未定义,req.body.done 也未定义。我尝试只插入 req.body 并没有奏效。我不确定这是否可行。我尝试按照 Ken 的建议添加内容类型标头,但这也不起作用。与此同时,我正在继续研究 req.body.text 未定义的原因。
    • 您的程序中似乎没有完成参数和文本。在来自 scottch.io 的示例中,表单 formdata.text 中的数据已发布,并且不需要发布,因为新的 todo done = false 总是。这样就完成了分配服务器端。如果您不使用表单,您可以执行 $scope.appdata.text="";$scope.appdata.userEmail="" 等...然后 $http.post('/api/brackets' $scope.appdata )。然后您的服务器将被发送一个 req.body.text 等。确保您的 mongoose Schema 匹配所有参数。
    • 迈克,原来是这样。多么愚蠢的错误。我现在开始工作了。感谢您的帮助。
    【解决方案2】:

    我在使用 Grails 作为后端时遇到了类似的问题,所以这可能对您没有帮助。我必须明确设置 Content-Type。

    $http({
        method: 'POST',
        url: serverURL + '/' + scope.controller + '/save',
        data: $form.serializeObject(),
        headers: {'Content-Type': 'application/json'}
    })
    

    我会简单地发表评论,但我没有允许这样做的声誉。

    【讨论】:

    • 是的,Postman 出于某种原因不发送 Content-Type。我以前见过人们遇到这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多