Angular8:拦截HTTP响应时出错

时间:2019-12-02 13:08:05

标签: angular typescript angular-http-interceptors

我试图使用角度拦截器作为

来拦截所有HttpResponse。
return next.handle(request).pipe(
      map((event: HttpEvent<any>) => {
        if (event instanceof HttpResponse) {
          // do stuff with response and headers you want
          event.body = event.body.data || event.body;
          console.log('event--->>>', event);
        }
        return event;      
      })
    );

但是打字稿给出了错误

ERROR in src/app/shared/interceptors/auth.interceptor.ts(35,17): error TS2540: Cannot assign to 'body' because it is a read-only property.

该怎么办?

  

注意:使用Object.assign克隆对象仍然会给新对象带来相同的错误。

3 个答案:

答案 0 :(得分:1)

您不能像这样重新分配变量:

return next.handle(request).pipe(
  map((event: HttpEvent<any>) => {
    let returnValue = Object.assign({}, event);
    if (event instanceof HttpResponse) {
      // do stuff with response and headers you want
      returnValue.body = event.body.data || event.body;
      console.log('event--->>>', event);
    }
    return returnValue;      
  })
);

由于您已经重新分配了变量,因此您应该能够更改其主体

编辑:如果您确定自己的对象内部具有body属性,则可以这样进行分配

return next.handle(request).pipe(
    map((event: HttpEvent<any>) => {
        let returnValue = Object.assign({}, event);
        if (event instanceof HttpResponse) {
            // do stuff with response and headers you want
            returnValue.body = event['body'].data || event['body'];
            console.log('event--->>>', event);
        }
        return returnValue;
    );    

答案 1 :(得分:1)

private int size; private String font; MyFrame (String name){ super (name); setBounds(500,500,600,400); setResizable(false); setDefaultCloseOperation(EXIT_ON_CLOSE); //log in text JLabel lbl = new JLabel("Log in"); lbl.setBounds(250, 60, 600, 50); size = 40; font = "Arial"; lbl.setFont(new Font(name,Font.PLAIN,size)); add(lbl); //adding button JButton btn = new JButton("Student"); btn.setBounds(150, 260, 60, 40); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); new Frame("StudentLogIn"); } }); add(btn); //adding second button JButton teach = new JButton("Teacher"); teach.setBounds(100,260,60,40); teach.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); new FrameTeach("TeacherLogIn"); } }); add(teach); setVisible(true); } } public class StartingWindow { public static void main(String[] args) { new MyFrame("Starting Window"); } } 对象的body属性是只读的,您不能重新定义/重新分配它。您可以做的是将事件复制到新创建的事件中,修改该事件的主体,然后返回该对象。

event

答案 2 :(得分:0)

最后使用event.clone方法解决了

    return next.handle(request).pipe(
      map((event: HttpEvent<any>) => {
        if (event instanceof HttpResponse) {
          let newEvent: HttpEvent<any>;
          // alter response here. maybe do the following
          newEvent = event.clone({
            // alter event params here
            body: event.body.data || event.body
          });
          return newEvent;
        }
      })
    );