无法通过rest API从客户端ajax POST请求接收数据

时间:2014-08-21 14:15:35

标签: javascript jquery node.js

我在服务器上构建了一些rest API,并从其他域调用Get请求工作正常,但我在调用POST请求时遇到问题。

我无法接收客户端发送的服务器数据。

服务器代码:

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
//var fn = require('fn')

var app = express();
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');

    // intercept OPTIONS method
    if ('OPTIONS' === req.method) {
        res.send(200);
    }
    else {
        next();
    }
};

// all environments
app.set('port', process.env.PORT || 3000);
app.use(allowCrossDomain);


// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}
app.post('/user', user.saveUser);


http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

exports.saveUser = function(req, res) {
    var key = req.body.key; //fb,twitter,web
    var userData = req.body.userData;
    var result  = checkUser(userData,key);        
}

客户代码请求的位置:

var data = { key: 'web', userData: userData }
$.ajax({
    method: "POST",
    //contentType: 'application/json',
    url: "www.acbd.com/user",
    //url:"http://prayable-21641.onmodulus.net/user",
    data: data,
    crossDomain: true,
    dataType: "json"
}).success(function (data, textstatus) {
    // this callback will be called asynchronously
    // when the response is available

    console.log(data)
    console.log(textstatus)
}).error(function (data, textstatus) {
    console.log(data)
    console.log(textstatus)
    // called asynchronously if an error occurs
    // or server returns response with an error status.
});

我无法在服务器上获取key或userData,它说它们没有定义:

  

TypeError:无法读取未定义的属性“key”

2 个答案:

答案 0 :(得分:2)

您忘记要求并使用正文解析器中间件模块。

另外,为什么内容类型被注释掉了?你需要它

服务器代码应如下所示:

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
//var fn = require('fn')

//requiring body-parser
var bodyParser = require('body-parser');

var app = express();
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');

  // intercept OPTIONS method
  if ('OPTIONS' === req.method) {
      res.send(200);
  }
  else {
      next();
  }
};

// all environments
app.set('port', process.env.PORT || 3000);
app.use(allowCrossDomain);


// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

// using body-parser
app.use(bodyParser());

app.post('/user', user.saveUser);


http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

另外,不要忘记npm安装它:

npm install body-parser

答案 1 :(得分:0)

//查询正文解析器,确保使用

进行安装
  

npm install body-parser

var bodyParser = require(' body-parser');

然后使用它

  

app.use(bodyParser.json());

     

app.use(bodyParser.urlencoded());

希望有所帮助