如何在Angular 2中进行正确的http post调用?

时间:2016-05-03 18:02:30

标签: node.js http angular

我开始使用Angular 2,我想对我的node.js服务器进行调用以更新数据。这是我服务中的代码:

updateEmployee(id : string, firstName? : string, lastName? : string){
    let body : string = JSON.stringify({ "firstName" : "test", "lastName" : "testtwo"});

    return this.http.post(this._employeesUrl + id, body)
      .map(res => res.json())
      .catch(this.handleError);
  }

我的API路线代码:

exports.update = function(req, res) {
  Employee.model.findById(req.params.id).exec(function(err, item) {

    if (err) return res.apiError('database error', err);
    if (!item) return res.apiError('not found');
    console.log(req);
    var data = (req.method == 'POST') ? req.body : req.query;

    item.getUpdateHandler(req).process(data, function(err) {

      if(req.body.firstName){
        item.firstName = req.firstName;
      }
      if(req.body.lastName){
        item.lastName = req.body.lastName;
      }

      if (err) return res.apiError('create error', err);

      res.apiResponse(
        200
      );

    });

  });
}

当我和邮递员一起打电话时,一切正常,但在Angular 2中,我似乎没有得到身体参数。这是如何以正确的方式完成的?我尝试过很多东西,但没有一个能奏效。

我尝试在选项中添加标题,但这并没有解决问题:

Error after adding headers

2 个答案:

答案 0 :(得分:2)

您必须添加content-type标题。

updateEmployee(id : string, firstName? : string, lastName? : string){
    let body : string = JSON.stringify({ "firstName" : "test", "lastName" : "testtwo"});
    let headers = new Headers({ 'content-type': 'application/json' });
    let options = new RequestOptions({ headers: headers });

    return this.http.post(this._employeesUrl + id, body, options)
      .map(res => res.json())
      .catch(this.handleError);
  }

答案 1 :(得分:0)

我需要添加标题,如rgvassar所说:

let body : string = JSON.stringify({ "firstName" : firstName, "lastName" : lastName});
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });
    return this.http.post(this._employeesUrl + id, body, options) 
    .map((res: Response) => res)

但是我的API(使用Keystonejs)也存在CORS问题,因为我发送了一个包含请求的标头,我需要在CORS上允许OPTIONS。这两件事解决了这个问题。