登录密码错误:
res.status=200;status_code=550,status_msg=‘密码错误’;=》首先进入then(success)里面,然后再判断是否ok。
404:403,401也是这个情况。
res.status=404,==》进入了catch里面。
// 401的时候,自动清除了cookie里的信息;
403的时候,并没有
其中:res.status即General
里面的Status Code
,status_code指Response Headers
里面的status_code
。
注:不同浏览器里,大小写可能不同的。eg:
status_msg 和 Status_msg
=>查看不同浏览器的时候,发现ie报错;修改polyfill.ts,并安装依赖。
import '../widget/script/base64.js';
declare var Base64: any;
或者:
参考:https://www.npmjs.com/package/js-base64
// 安装
npm install --save js-base64
// 导入
import { Base64 } from 'js-base64';
// 使用:
Base64.encode('abc'); // YWJj
constructor:
constructor(public http: HttpClient,
public router: Router,) {
}
基本方法:
public jsonCall(data, url, type):any {
console.log(this.http);
console.log('jsonCall执行了');
return new Promise((resolve, reject) => {
if (type === 'get' || type === 'delete') {
console.log('http:', this.http);
this.http[type](url, {
headers: new HttpHeaders({
currentA: 'AAA',
currentB: 'BBB'
}),
observe: 'response',
params: data
})
.toPromise()
.then(res => {
console.log('get-then里面的res:', res);
if (res.status === 200) {
this.handleSuccess(resolve, reject, res);
}
})
.catch(res => {
console.log('get-catch里面的res:', res);
this.handleError(resolve, reject, res);
});
} else {
this.http[type](url, data, {
headers: new HttpHeaders({
currentA: 'AAA-post',
currentB: 'BBB-post'
}),
observe: 'response',
params: {ksName: 'ks'}, // 这样也会拼接在url后面(我们的分页就是这种情况)
})
.toPromise()
.then(res => {
console.log('post-then里面的res:', res);
if (res.status === 200) {
this.handleSuccess(resolve, reject, res);
}
})
.catch(res => {
console.log('post-catch里面的res:', res);
this.handleError(resolve, reject, res);
});
}
});
}
success:
handleSuccess(resolve, reject, res) {
console.log('进入success里面');
const status_code = res.headers.get('status_code'); // 若果没有,那么值为null
const totalNum = res.headers.get('x-total-count'); // 如果没有,那么值为null
// 其中: null==undefined :true; null==null :true
// null===undefined :false; null===null :true
console.log('status_code:', status_code, 'totalNum:', totalNum);
if (status_code == 200 || !status_code) { // status_code返回为数值型,但是get以后,变为字符型;所以没用===
if (totalNum !== null) {
// 分页的情况
console.log('有分页的情况');
resolve({data: res.body, total: totalNum || 0});
} else {
console.log('没有分页的情况');
console.log('body是不是json格式的:', res.body);
resolve(res.body || null);
}
} else {
console.log(Base64);
const status_msg = res.headers.get('status_msg');
const error_msg = new Base64().decode(status_msg);
resolve({error_msg: error_msg, error_code: status_code});
}
}
error:
handleError(resolve, reject, res) {
console.log('handleError的情况:', res);
if (!!res && res.status === 401) {
// 登出
this.logout();
console.log('401的情况');
return;
}
if (!!res && res.status === 404) {
resolve({error_msg: 'not found'});
return;
}
let error_msg = '服务异常-ksbk';
const status_msg = res.headers.get('status_msg'); // || '服务异常-ksbk'
if (!!status_msg) {
error_msg = new Base64().decode(status_msg);
}
resolve({error_msg: error_msg});
}
// logout
logout(){
AppCommon.userInfo = null;
this.router.navigate(['gyauth/login']); // 401的时候,cookie里面的信息自动已经清除了。
}
// 接口里的错误提示:
// 错误信息
if (!!res && !!res.error_msg) {
this.nzMessageService.create('error', res.error_msg);
return;
}
编译ng build --prod
报错:
error TS2339: Property 'error_msg' does not exist on type '{}'.
修改res.error_msg
为res['error_msg']
;接口正确 的时候,返回的res没有error_msg,所以不用"."
的语法。
使用时候的报错:
// 使用:
this.roleList = res.data || []; // build报错
this.roleList = res['data'] || []; // ok
res.length // 报错???
res['length'] // ok
// 这是为什么?
// 报错内容:
error TS2339: Property 'data' does not exist on type '{}'.
error TS2339: Property 'length' does not exist on type '{}'. // 其实我返回的就是数组啊???
res.length // 报错???修改为:
const list: any = res || [];
list.length // ok了,使用变量转换一下(any)。
==》以上语法报错的原因:归根到底,使用:jsonCall返回类型为any
,那么就一切ok了。
public jsonCall(data: any, url, type): any {}
另外可以加上:
handleSuccess(resolve, reject, res?: any) {}
handleError(resolve, reject, res?: any) {}