API를 사용하여 Ionic 3 인증을하고 있지만 로그인 프로세스에서 오류가 표시됩니다.'json'속성을 읽을 수 없습니다.
이것은 나의 공급자> restapi> restapi.ts입니다.
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import {Http, Headers} from '@angular/http';
let apiUrl = 'http://192.168.1.10/honeybee/HoneyApi/';
@Injectable()
export class RestapiProvider {
constructor(public http: HttpClient) {
console.log('Hello RestapiProvider Provider');
}
getUsers(credentials, type) {
return new Promise((resolve, reject) => {
var headers = new Headers();
headers.append('Access-Control-Allow-Origin' , '*');
headers.append('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT');
headers.append('Accept','application/json');
headers.append('content-type','application/json');
this.http.post(apiUrl + type, JSON.stringify(credentials), {headers: headers})
.subscribe(res => {
resolve(res.json());
}, (err) => {
reject(err);
});
});
}
}
이것은 내 loginpage.ts입니다.
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { RestapiProvider } from '../../providers/restapi/restapi';
import { ListPage } from '../list/list';
@IonicPage()
@Component({
selector: 'page-loginpage',
templateUrl: 'loginpage.html',
})
export class LoginpagePage {
responseData : any;
userData = {"email": "", "password": ""};
constructor(public navCtrl: NavController, public navParams: NavParams,
public restProvider: RestapiProvider) {
}
ionViewDidLoad() {
console.log('ionViewDidLoad LoginpagePage');
}
getloginUsers(){
this.restProvider.getUsers(this.userData,'user_Login').then((result) => {
this.responseData = result;
if(this.responseData.userData){
console.log(this.responseData);
console.log("User Details");
this.navCtrl.push(ListPage);
}
else{
console.log("Incorrect Details"); }
}, (err) => {
// Error log
});
}
}
이것은 내 loginpage.html입니다.
<ion-header>
<ion-navbar>
<ion-title>loginpage</ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
<form (submit)="getloginUsers()">
<ion-list>
<ion-item>
<ion-label fixed>Email</ion-label>
<ion-input type="email" [(ngModel)]="userData.email" name="email"></ion-input>
</ion-item>
<ion-item>
<ion-label fixed>Password</ion-label>
<ion-input type="password" [(ngModel)]="userData.password" name="password"></ion-input>
</ion-item>
<div padding>
<button ion-button color="primary" block>Login</button>
</div>
</ion-list>
</form>
</ion-content>
로그인 버튼을 클릭하면 null의 속성 'json'을 읽을 수 없습니다. Advance에서 도움을 주신 모든 도움. 도와주세요.
먼저:
모델의너라면 추가 일FormsModule
설정 파일에서.
@NgModule({
declarations: [ MyApp ],
imports: [
FormsModule
...
)],
bootstrap: [...],
entryComponents: [ ... ],
providers: []
})
둘째:
JSON 형식으로 데이터를 보내고 Content-Type을 추가하십시오.
getUsers(credentials, type) {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
return this.http
.post(apiUrl + type, JSON.stringify(credentials), {headers: headers})
.map(res => res.json());
}
전화해서loginpage
(약속 없음)
this.restProvider.getUsers(this.userData,'user_Login')
.subscribe(res => this.responseData = result);
제삼:
백엔드는 성공 값을 반환해야합니다.. API에 오류 (유효한 이메일, 비밀번호 없음)가 있으면HTTP클라이언트에게 오류가 발생했습니다.
코르헤더는 Server Part에서 구현되어야합니다.
credentials
또는res
? - Konstantin Okhotnickcredentials
null 일 수 없습니다. 과res
있습니다. 때문에res
api에서 변수입니다 (let apiUrl = & # 39;192.168.1.10/honeybee/HoneyApi/' ;;) - Konstantin Okhotnick
다음과 같이 메소드를 변경하십시오.
getUsers(credentials, type) {
return new Promise((resolve, reject) => {
var headers = new Headers();
headers.append('Access-Control-Allow-Origin' , '*');
headers.append('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT');
headers.append('Accept','application/json');
headers.append('content-type','application/json');
this.http.post(apiUrl + type, JSON.stringify(credentials), {headers: headers})
.subscribe(res => {
resolve(res); ----- Change like this
}, (err) => {
reject(err);
});
});
}
loginpage.ts
파일 getloginUsers(){
this.restProvider.getUsers(this.userData,'user_Login').then((result) => {
if(result){
this.responseData = result.json();
if(this.responseData.userData){
console.log(this.responseData);
console.log("User Details");
this.navCtrl.push(ListPage);
}
else{
console.log("Incorrect Details"); }
}
}
, (err) => {
// Error log
});
}
또한, 약속 대신에 관찰 할 수있는 것을 반환하는 것이 더 쉽지 않을까요?
return this.http.post(apiUrl + type, JSON.stringify(credentials), {headers: headers});
문제는 문제를 일으키는 HttpClient의 restapi.ts 생성자에 있습니다.
constructor(public http: HttpClient) {
console.log('Hello RestapiProvider Provider');
}
이것으로 변경하십시오,
constructor(public http: Http) {
// console.log('Hello RestapiProvider Provider');
}
이 부분에 오류가 있습니다.{headers: headers}
여기에 오류가 있습니다 :
'{headers : Headers; } '에 할당 할 수 없습니다. 형식의 매개 변수 '{headers ?: HttpHeaders | {[header : 문자열] : 문자열 | 끈[]; }; 관찰 : "몸"; params ?: Ht ... '. 유형 '헤더'속성이 호환되지 않습니다. '헤더'유형을 'HttpHeaders | {[header : string] : 문자열 | 끈[]; } '. '헤더'유형을 '{[헤더 : 문자열] : 문자열 | 끈[]; } '. '헤더'유형에 색인 서명이 없습니다.
오류는 매우 깨끗하기 때문에 설명이 필요하지 않습니다. 코드를 변경하면 코드가 문제없이 작동합니다. 나는 나의 현지에서 시험했다.
res
개체의 값이 null 인 경우, 그렇지 않습니다. ~해라.console.log(res)
그것을 확인하십시오. - Sébastien