【问题标题】:can't find my json file in req.body when sending it through http post request通过http post请求发送时在req.body中找不到我的json文件
【发布时间】:2017-02-16 23:45:47
【问题描述】:

我几乎已经在我的应用程序中添加了一个新功能,试图通过 express 将 json 文件从 angular 前端传递到节点后端。原始代码来自How do I write a JSON object to file via Node server?。我的控制器部分代码如下所示:

var app = angular.module('myApp',[]);
app.controller('myCtrl',function ($scope, $http){
  $scope.saveImage = function(){
    var data = JSON.stringify(canvas);
    debugger;
    $http({
      url: 'http://localhost:8080',
      method: "POST",
      data: data,
      header: 'Content-Type: application/json'
    });
  }
});

我可以从开发人员工具中看到,json 字符串“数据”确实已经创建,并且在我的控制器前端中有很多东西。但是当我将它传递到节点端时,我无法从 req.body 中得到任何东西。 这是我的后端代码:

// set up
var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({extended: false}));
var saveCount = 1;
//functions
// application -------------------------------------------------------------
app.use(express.static('./public'));

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.post('/', function (req, res) {
  fs.writeFile(__dirname+"/save/post"+saveCount.toString()+".json", req.body, function(err) {
    if(err) {
       return console.log(err);
    }
    res.send('The file was saved!');
  }); 
  saveCount++;
});

//listen
app.listen(8080, function () {
  console.log('Example app listening on port 8080!');
});

每次我检查我的 psot.json 文件时,它只有 [object Object]

我完全不知道这里发生了什么。

【问题讨论】:

    标签: javascript json node.js express angular


    【解决方案1】:

    一些事情:

    1. 您不需要对数据对象调用 JSON.stringify()。只需将对象按原样传递给 $http。
    2. 您需要传递 bodyParser.json() 而不是 bodyParser.urlencoded()。
    3. 应在尝试写入文件之前调用 JSON.stringify()。

    您的代码应如下所示:

    var app = angular.module('myApp',[]);
    app.controller('myCtrl',function ($scope, $http){
      $scope.saveImage = function(){
        debugger;  // What does this do?
        $http({
          url: 'http://localhost:8080',
          method: "POST",
          data: canvas,
          header: 'Content-Type: application/json'
        });
      }
    });
    

    // set up
    var express = require('express');
    var app = express();
    var fs = require('fs');
    var bodyParser = require("body-parser");
    app.use(bodyParser.json());
    var saveCount = 1;
    //functions
    // application -------------------------------------------------------------
    app.use(express.static('./public'));
    
    app.get('/', function (req, res) {
      res.send('Hello World!');
    });
    
    app.post('/', function (req, res) {
      fs.writeFile(__dirname+"/save/post"+saveCount.toString()+".json", JSON.stringify(req.body), function(err) {
        if(err) {
           return console.log(err);
        }
        res.send('The file was saved!');
      }); 
      saveCount++;
    });
    
    //listen
    app.listen(8080, function () {
      console.log('Example app listening on port 8080!');
    });
    

    [object Object] 表示您的对象实际上正在发送到服务器并被正确解析,这只是该对象的表示。但是,您确实不需要在前端进行字符串化。 $http 将为您处理发送对象,您只是在为您的应用程序创建额外的工作。虽然 bodyParser 可能正在获取发布数据(可能是因为您在前端处理它的方式),但您真正想要的是 bodyParser 使用 .json() 方法将其解析为 JSON 对象,因为那是它是什么。

    如果您不想经历所有这些,您可以保留现有的内容并将您的 Content-Type 更改为 application/text 或类似的内容,这样它在到达时不会被解析为对象服务器。

    【讨论】:

    • 我明白你的意思。看来我只是自己整理了数据格式。顺便说一句,如果您在浏览器中以调试模式打开调试器,则调试器用于停止 Web 加载(在我的情况下,我使用 chrome 开发人员工具,而不是它将保留在那里,您可以检查每个 var 到底持有什么时刻)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多