【问题标题】:POST, PUT, DELETE requests from AngularJS $http/AJAX to Node.js + Express.js based API从 AngularJS $http/AJAX 到基于 Node.js + Express.js 的 API 的 POST、PUT、DELETE 请求
【发布时间】:2017-12-02 02:42:56
【问题描述】:

我在 Node.js 和 Express.js v4 上编写了后端 API,这部分(index.js):

app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', 'http://example.com');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});

app.post('/add1', function (req, res) {
    db.one("INSERT INTO table(value1) VALUES (${value1}) RETURNING ID", req.query).then(function (data) {
        res.json(data);
    }).catch(function (error) {
        res.json(error);
    });
});

app.put('/add2', function (req, res) {
    db.one("INSERT INTO table(value1) VALUES (${value1}) RETURNING ID", req.query).then(function (data) {
        res.json(data);
    }).catch(function (error) {
        res.json(error);
    });
});

app.get('/add3', function (req, res) {
    db.one("INSERT INTO table(value1) VALUES (${value1}) RETURNING ID", req.query).then(function (data) {
        res.json(data);
    }).catch(function (error) {
        res.json(error);
    });
});

我有这样的 Angular JS 或示例 ajax

app.controller('globalController', function($scope, $http) {
    var jsd = {};
    jsd.value1=1;
    $http.put(API_URL + 'add2', jsd).then(function(data) {
        console.log(data);
    }, function(data) {
        console.log(data);
    });
});

$.ajax({
            url: API_URL + 'add1',
            method: 'POST',
            dataType: 'json',
            data: jsond,
            success: function(data) {
                console.log(data);
            },
            error: function(data) {
                console.log(data);
            }
        });

但是我没有收到任何数据到我的req.query 并且通常在req 对象中。当我使用 get 向 add3 发出 AJAX 请求时,一切正常,req.query 有我的参数。

我读到了这个解决方案:

app.config(function ($httpProvider) {
        $httpProvider.defaults.transformRequest = function(data){
            if (data === undefined) {
                return data;
            }
            return $.param(data);
        };
        $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
    });

和解决方案here

var multer = require("multer");

//...

var upload = multer({ dest: "./upload/" });
app.post("/post", upload.array(), function(req, res) {
    console.log(req.body);
    res.send(null);
}

我先试过了,不行,第二个是太奇怪的解决方案(我无法将数据保存到文件等)我认为问题出在第一个 OPTION 请求中,但我用谷歌搜索了它,没有找到解决方案。我需要很少的示例(工作代码)如何从 Angular $http 或 AJAX 发送 POST 或 PUT 数据,并在 node.js 的 req 对象中使用这些数据。在 GET 请求中,这一切都有效,但我怎样才能让它在其他人身上有效?

【问题讨论】:

    标签: angularjs node.js ajax express


    【解决方案1】:

    您使用的是哪个版本的 Express?您可能正在编写旧方式并使用新版本。

    你可能想看看这个——How to retrieve POST query parameters?

    无论如何,我建议您使用 ngResource 在 Angular 中进行 REST HTTP 调用。

    1. 实例化工厂 这将公开一些方法,例如querysave 等。

    angular
      .module('MyModule')
      .factory('AddEndpoint', AddEndpoint);
    
    AddEndpoint.$inject = ['$resource'];
    
    function AddEndpoint($resource) {
      return $resource(API_URL + '/:param', { param: '@param' });
    }
    1. 享受工厂

    angular
      .module('MyModule')
      .controller('MyController', MyCtrl)
     
    MyCtrl.$inject = ['AddEndpoint'];
    
    function MyCtrl(AddEndpoint) {
      var scope = this;
      scope.getFromApi = AddEndpoint.get({ params: 'add1' }); // GET 'API_URL/add1'
      scope.postToApi = postToApi;
    
      function postToApi(data) {
        data.params: 'add2'
        AddEndpoint.save(data); // POST to 'API_URL/add2'
      }
    }

    【讨论】:

    • 我用快递4
    • 所以你需要body-parser 根据我提到的链接。 npm install --save body-parser 并将其导入您的 index.js 其余部分您可以按照链接中的指南进行操作。祝你好运,玩得开心!
    • 奇怪的事情发生了,我添加了app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json());@rolodex 现在在ajax post 中它可以工作,ajax put 不起作用,$http post/put 都不起作用
    • 什么?我无法理解你想说什么...首先你说POST 工作,然后POSTPUT 都没有?
    • 经过 1 天的工作,我解决了问题,谢谢。部分解决方案提供帮助
    猜你喜欢
    • 2012-01-25
    • 2019-09-27
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2018-02-19
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多