我试图使用角度拦截器作为
来拦截所有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
克隆对象仍然会给新对象带来相同的错误。
答案 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;
}
})
);