【问题标题】:handle cross domain ajax post in node js在节点 js 中处理跨域 ajax 帖子
【发布时间】:2015-10-20 12:27:42
【问题描述】:

我的 app.js 有下面的 post 处理程序

app.all('/', function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
});

app.options('*', cors());

var allowCrossDomain = function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
    next();
};

app.use(allowCrossDomain);

var whitelist = ['http://myurl.net'];

var corsOptions = {
    origin: function (origin, callback) {
        var originIsWhitelisted = whitelist.indexOf(origin) !== -1; callback(null, originIsWhitelisted);
    }
};
app.post('/ValidateUser/users',cors(corsOptions) , function (req, res) {
    var db = req.db;
    var collection = db.get('userlist');

    collection.find({}, {}, function (e, docs) {
        res.json(docs);
    });

    res.send("Hey");
});

调用它的html页面有以下代码

var user = { "bla":"bla"  };

function checkUser() {
    $.ajax({
        type:"POST",
        url: 'http://localhost:1337/validateuser/users',
        data: user,
        crossDomain: true,
        dataType:"jsonp"
        //jsonp: false,
        //jsonpCallback: 'jsonCallback'
    }).success(function (data) { console.log(data) });
};

当我保留断点并检查 req.body 时,req.body 中没有未定义的参数

我无法从节点 js 中的 html 中获取我发布的数据

【问题讨论】:

  • error invalid credentials 听起来可能与您的数据库配置有关,与 Ajax 无关。 (也就是说,您正在尝试使用 JSONP 发出 POST 请求,这是不可能的)。
  • 那么可以做些什么来发送数据呢?
  • 使用 XMLHttpRequest 代替 JSONP。
  • 查看here 并搜索withCredentials
  • 谢谢@robertklep res.body 仍然不包含我发送的数据不知道是什么问题

标签: javascript node.js express cross-domain


【解决方案1】:

使用body-parser模块获取数据,例如:

server.js:

var express = require('express');
var bodyParser = require('body-parser');
var db = require('./db'); //module that contains db connection config

var app = express();

app.use(bodyParser());

app.get('/', function(req, res) {
    res.sendFile('/index.html', {root: __dirname });
});

app.post('/users', function(req, res) {
    console.log(req.body); //req.body contains the user = {bla: 'bla'} object
    var user = req.body;
    var collection = db.get('userlist');
    collection.find(user, function (e, docs) {
        res.json(docs);
    });
    res.send("Hey");
});

var server = app.listen(3000, function() {
    console.log('listening');
});

index.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
    <script>
    var user = { "bla":"bla"  };
    function checkUser(data) {
        $.ajax({
            type:"POST",
            url: 'http://localhost:3000/users',
            data: data,
            dataType: "json"
        }).success(function (data) { console.log(data) });
    };
    checkUser(user);
    </script>

</body>
</html>

【讨论】:

  • 是的,但我怎样才能获得通过 post 请求发送的数据?
  • 感谢 Konrad +1 的示例代码 Ya req.body 应该包含数据但它不是,因为请求是跨域的,所以我面临一些问题检查我更新的问题
猜你喜欢
  • 2011-03-16
  • 2013-04-11
  • 2013-11-26
  • 2018-05-09
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多