如何修改响应标头?

时间:2018-12-20 15:22:57

标签: node.js request

自2天以来,我遇到了困扰我的问题。

request( {url: url } , function(err,res, body){ res.headers['...'] = ...; return res }).pipe(response);

我认为这段代码会从第一个响应中更改标头,然后将其放在第二个响应中。但不是,所有尝试都会失败。我尝试了,但没有尝试,没什么。

看,我真的很平静,思想开阔。

这就是我的代码简洁明了:

   modify_header(err,res,body){

        var header = res.headers;

        header['x-frame-options'] = null;
        header['Set-Cookie'] =  'HttpOnly;';
        return res;
    }


   request_src(req,response){

      let isabsolute = this.decode_href(req.url);


      if(!isabsolute) {
           request.get({ url : this.url+req.url , headers : this.headers },this.modify_header).pipe(response);
      }else{
           request.get({ url : isabsolute , headers : this.headers },this.modify_header).pipe(response);
      }

     return false;

}

request_src(req,response)是在http.createServer中调用的函数,因此,req和response只是来自客户端的请求。 然后,当我执行request.get( {url:this.url ...时,我会将客户的请求发送到另一个站点,例如代理。但是我需要在“其他站点”和客户端之间更改标题。并确信我,函数Modify_header不会进行任何修改。

不,当我设置header['x-frame-options'] = null; res.headers等于null时,我只说谎了一点。没关系 但是,在浏览器(客户端)中,它不是那样工作的。 “ x-frame-options”被拒绝或不是我的(与cookie相同)。

你能帮我吗,我从两天开始就拔头发了,这对我不利。

谢谢。

2 个答案:

答案 0 :(得分:0)

问题在于,回调实际上是在请求完成之后发生的,这是在管道已经开始将数据流传输到响应之后的方式。您可能想加入响应事件,它看起来像这样:

request.get({ url: this.url + req.url, headers: this.headers })
    .on('response', function (resp) {
        resp.headers['my-custom-header'] = 'blah';
    })
    .pipe(response);

response事件是在流到目的地(在这种情况下,返回到原始调用者)之前 发出的,因此您应该可以使用此功能执行所需的操作方法。

答案 1 :(得分:0)

我的代码现在看起来像这样:

modify_header(res){

     var header = res.headers;

     header['x-frame-options'] = null;
     header['Set-Cookie'] =  'HttpOnly;';
    return res;
}


request_src(req,response){

    console.log('original: ',req.url);
    let isabsolute = this.decode_href(req.url);

    if(!isabsolute) {

        request.get({ url : this.url+req.url , headers : this.headers })
        .on('response',this.modify_header)
        .pipe(response);

    }else{

        request.get({ url : isabsolute , headers : this.headers})
        .on('response',this.modify_header)
        .pipe(response);

    }

    return false;

}