通过http post request

时间:2016-10-07 21:56:23

标签: javascript json node.js express angular

我几乎在我的应用程序上添加了一个新功能,试图通过express将json文件从angular frontend传递到node后端。原始代码来自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字符串“data”确实已经创建,并且在我的控制器前端中有很多东西。但是当我将它传递给节点端时,我无法从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]

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

1 个答案:

答案 0 :(得分:1)

一些事情:

  1. 您不需要在数据对象上调用JSON.stringify()。只需将对象传递给$ http。
  2. 您需要传递bodyParser.json()而不是bodyParser.urlencoded()。
  3. 在尝试写入文件之前应调用JSON.stringify()。
  4. 您的代码应如下所示:

    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对象,因为那是它是什么。

    如果您不想完成所有这些操作,可以保留现在的内容并将内容类型更改为应用程序/文本或类似内容,以便在它到达时不会将其解析为对象服务器