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>
私はログインボタンをクリックすると、ヌルのプロパティ 'json'を読み取れません。アドバンスで感謝したすべての助け。助けてください。
最初:
モデルのあなたが追加する場合は動作します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クライアントにエラーが発生しました。
CORSヘッダーはServer Partで実装する必要があります。
credentials
またはres
? - Konstantin Okhotnickcredentials
ヌルにすることはできません。そして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});
問題はあなたのrestapi.tsコンストラクタで、HttpClientが問題を引き起こしています。
constructor(public http: HttpClient) {
console.log('Hello RestapiProvider Provider');
}
これをこれに変更し、
constructor(public http: Http) {
// console.log('Hello RestapiProvider Provider');
}
この部分にエラーがあります{headers: headers}
あなたのエラーはここにあります:
型の引数 '{headers:Headers; } 'に割り当てることはできません タイプ '{ヘッダーのパラメータ:HttpHeaders | {[ヘッダー:文字列]: 文字列|文字列[]; }; 「体」を観察する。 params ?: Ht ... '。の種類 プロパティ 'ヘッダー'は互換性がありません。 タイプ 'ヘッダ'はタイプ 'HttpHeaders | {[ヘッダー:文字列]:文字列|文字列[]; } '。 タイプ 'ヘッダ'はタイプ '{[ヘッダ:文字列]:文字列|文字列[]; } '。 ヘッダーの種類にインデックスの署名がありません。
エラーはきれいですので説明は必要ありません。コードを変更しても問題なく動作します。私は自分の地元でテストした。
res
オブジェクトの値がnullの場合、それはありませんか? 〜を行うconsole.log(res)
それを確認する。 - Sébastien