繁体   English   中英

从AngularJS $ http / AJAX向基于Node.js + Express.js的API的POST,PUT,DELETE请求

[英]POST, PUT, DELETE requests from AngularJS $http/AJAX to Node.js + Express.js based API

我在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.queryreq对象中req.query任何数据。 当我用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';
    });

和解决方案在这里

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请求中,所有这些都有效,但是如何使它在其他对象上起作用?

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

您可能想检查一下- 如何检索POST查询参数?

无论如何,我建议您使用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' } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM