javascript - Ionic2 在 Provider 中使用 Ionic Storage

标签 javascript angular typescript ionic2

我尝试为使用 JWT 的 Node 应用程序实现身份验证提供程序

我收到错误

TypeError: Cannot read property 'set' of undefined

我的 app.module.ts 如下所示。

import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';

import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { LoginPage } from '../pages/login/login';

import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';

import { HttpModule } from '@angular/http';
import { Auth } from '../providers/auth/auth';

import { Storage } from '@ionic/storage';

export function provideStorage() {
 return new Storage( { name: '__mydb' } /* optional config */);
}

@NgModule({
  declarations: [
    MyApp,
    HomePage,
    LoginPage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    HttpModule,
    // IonicStorageModule.forRoot({
    //   name: '__mercury',
    //   driverOrder: ['indexeddb', 'websql']
    // })
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage,
    LoginPage
  ],
  providers: [
    StatusBar,
    SplashScreen,
    LoginPage,
    { provide: Storage, useFactory: provideStorage },
    { provide: ErrorHandler, useClass: IonicErrorHandler },
    Auth
  ]
})
export class AppModule { }

我使用了 https://github.com/driftyco/ionic-storage/tree/v2.0.1#configuring-storage-new-in-117 中的文档

我的 auth.provider.ts

import { Injectable } from '@angular/core';
import { Http, Response, Headers } from '@angular/http';
import 'rxjs';
import { Storage } from '@ionic/storage';
/*
  Generated class for the AuthProvider provider.

  See https://angular.io/docs/ts/latest/guide/dependency-injection.html
  for more info on providers and Angular 2 DI.
*/
@Injectable()
export class Auth {
  baseUrl: string = "http//localhost:9080/"

  constructor(public http: Http, public storage: Storage) {
    console.log('Hello AuthProvider Provider');
  }

  createAuthorizationHeader(headers: Headers) {
    let token;
    this.storage.get('token').then(data => token = data);
    headers.append('Athorization', token);
  }

  login(data) {
    return this.http.post('//localhost:9080/auth', data)
      .map(this.extractData);
  }

  isLogged() {
    this.storage.get('token').then(data => {
      if (data)
        return true;
      else
        return false;
    }).catch(err => {
      return false;
    });
    return false;
  }

  logout() {
    this.storage.remove('token');
    return true;

  }

  private extractData(res: Response) {
    console.log(res);
    let body = res.json();
    if (body.success === true) {

        this.storage.set("token", body.token);


    };
    return body || {};
  }
}

我的平台详细信息是

Ionic Framework: 3.2.1
Ionic Native: ^3.5.0
Ionic App Scripts: 1.3.7
Angular Core: 4.1.0
Angular Compiler CLI: 4.1.0
Node: 6.10.3
OS Platform: macOS Sierra
Navigator Platform: MacIntel
Ionic Storage : ^2.0.1

最佳答案

改变

login(data) {
    return this.http.post('//localhost:9080/auth', data)
      .map(this.extractData);
 }

login(data) {
    return this.http.post('//localhost:9080/auth', data)
      .map(this.extractData.bind(this));
 }

login(data) {
    return this.http.post('//localhost:9080/auth', data)
      .map((data)=>this.extractData(data));
 }

您的this并未引用您的组件

关于javascript - Ionic2 在 Provider 中使用 Ionic Storage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44150124/

相关文章:

typescript - 如何以声明方式强制类型的兼容性?

javascript - 使用 promises 多次运行相同的异步函数

javascript - 如何访问父对象属性?

javascript - 指令 : toggle its boolean attribute value 的 onDblclick

javascript - 在 angular2 中渲染 formControlName 时未定义 formcontrolname

angular - 在 Angular2 中传递多个路由参数

javascript - 如何设置 div#a 的宽度等于 div#b

Angular 客户端错误记录到服务器

node.js - 如何调试无服务器框架插件?

node.js - 如何在 TypeScript 文件中要求 NodeJS?