angular - http.get().pipe() - 无法从服务器获取实际响应对象以进行日志记录
问题描述
用例 - 对服务器进行 http get 调用。记录来自服务器的实际响应。转换响应对象(将纪元日期字段转换为 javascript 日期)。然后返回转换后的对象。
代码片段 -
/** GET users from the server */
getUsers(): Observable<IUser[]> {
this.logger.log(`GET on ${this.baseUrl}`);
return this.http.get<IUser[]>(this.baseUrl).pipe(
tap(users => this.logger.log(`fetched users - `, users)),
map(users => {
return users.map(user => this.convertResponse(user));
}),
catchError(handleError.bind({ logger: this.logger }))
);
}
目前我正在使用 tap() 来记录响应。然后使用 map() 转换响应对象。但是显示的日志消息是转换后的对象,而不是来自服务器的原始响应。
如何在转换之前捕获响应对象?
编辑 -
private convertResponse(user: IUser): IUser {
user.createdDate = new Date(user.createdDate);
user.modifiedDate = new Date(user.modifiedDate);
return user;
}
解决方案
您的convertResponse
方法对数组中的对象进行了变异(然后返回变异的对象)。您确实记录了数组的“未转换”版本,但是当您在开发人员工具中点击“expend”时,突变已经发生,您正在查看突变发生后对象的样子。
在 Chrome 中展开对象时,如果将蓝色“i”工具提示悬停在展开旁边,您会看到此警告。
更改您的convertResponse
方法以返回一个新对象。
private convertResponse(user: IUser): IUser {
return {
...user,
createdDate = new Date(user.createdDate),
modifiedDate = new Date(user.modifiedDate),
}
}
推荐阅读
- azure-application-insights - 如何通过 JavaScript SDK 在 Application Insights 中禁用标准性能计数器?
- python - 如何在while循环中正确使用多处理apply_async池
- java - 雄猫错误。ajp_service::jk_ajp_common.c ajp_send_request::jk_ajp_common.c
- reactjs - 为什么 webpack 认为我的模块不是模块?
- excel - VBA:由数组填充的组合框
- c++ - 如何拆分类定义(头文件)、类声明(源文件)和主函数(源文件)中的代码?
- laravel - Vee Validate - 服务器端验证和前端验证
- python - 使用假设测试 Python 函数引发错误
- excel - 在表中查找第一个值,然后输出特定列
- nlp - 如何使用 BERT 获取句子中短语的上下文嵌入?