Как исправить ‘TypeError: не удается прочитать свойство ‘, затем’ неопределенного TypeError: не удается прочитать свойство ‘, затем’ неопределенного …’

#android #angular #typescript #sqlite #ionic-framework

#Android #angular #typescript #sqlite #ionic-framework

Вопрос:

Я собираюсь создать приложение для управления запасами Ionic со сканером штрих-кода и SQLite с помощью этого руководства:https://www.techiediaries.com/ionic-cordova-sqlite-barcode-scanner-product-inventory-manager /

Когда я добавляю этот код:

  constructor(public sqlite :SQLite) {
          console.log('Hello DataServiceProvider Provider')

              this.sqlite.create({name: "data.db", location: 
    "default"}).then((db : SQLiteObject) => {
                      this.database = db;
                  }, (error) => {
                      console.log("ERROR: ", error);
              }); 
  

…для data-service.service.ts я получил эту ошибку:

ошибка core.js: 19866 ОШИБКА Ошибка: не обнаружена (в обещании): TypeError: не удается прочитать свойство ‘then’ неопределенного TypeError: не удается прочитать свойство ‘then’ неопределенного при новом DataServiceService (data-service.service.ts: 64) при _createClass (core.js: 26976) при createProviderInstance (core.js: 26941) в resolveNgModuleDep (core.js: 26888) в NgModuleRef.get (core.js: 27996) в resolveNgModuleDep (core.js: 26908) в NgModuleRef_.get (core.js: 27996) в resolveDep (core.js: 28518) в createClass (core.js: 28366) в createDirectiveInstance (core.js: 28186) в Разрешить проблему (zone.js: 831) в разрешении проблемы (zone.js: 788) в zone.js:892 в ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423) в Object.onInvokeTask (core.js: 21826) в ZoneDelegate.push../node_modules/zone.js/dist/zone .js.ZoneDelegate.invokeTask (zone.js:422) в Zone.push../node_modules/zone.js/dist/zone.js.Zone.RunTask (zone.js:195) в drainMicroTaskQueue (zone.js:601)

Это весь код data-service.service.ts:

 import { Injectable } from '@angular/core';

import { SQLite, SQLiteObject } from '@ionic-native/sqlite/ngx';



@Injectable({
  providedIn: 'root'
})
export class DataServiceService {
  public database: SQLiteObject;

  productTable : string = `CREATE TABLE IF NOT EXISTS  products (
    id INTEGER PRIMARY KEY,
    sku TEXT,
    barcode TEXT,
    title TEXT NOT NULL,
    description TEXT,
    quantity REAL,
    unit VARCHAR,
    unitPrice REAL,
    minQuantity INTEGER,
    familly_id INTEGER,
    location_id INTEGER,
    FOREIGN KEY(familly_id) REFERENCES famillies(id),
    FOREIGN KEY(location_id) REFERENCES locations(id)
    );`;

familyTable : string = `CREATE TABLE IF NOT EXISTS famillies (
    id INTEGER PRIMARY KEY,
    reference VARCHAR(32) NOT NULL,
    name TEXT NOT NULL,
    unit VARCHAR);`;

locationTable : string = `CREATE TABLE IF NOT EXISTS locations (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL);`;
//Date , Quantity , Unit Cost , Reason (New Stock - Usable Return - Unusable Return ) ,UPC (Universal Product Code ) Comment    
transactionTable : string = `CREATE TABLE IF NOT EXISTS transactions (
        id INTEGER PRIMARY KEY,
        date TEXT,
        quantity REAL,
        unitCost REAL,
        reason VARCHAR,
        upc TEXT,
        comment TEXT,
        product_id INTEGER,
        FOREIGN KEY(product_id) REFERENCES products(id));`;

        async createTables(){
          try {
            await this.database.executeSql(this.familyTable);
            await this.database.executeSql(this.locationTable);
            await this.database.executeSql(this.productTable);
            await this.database.executeSql(this.transactionTable);
          }catch(e){
              console.log("Error !");
          }
      }

        constructor(public sqlite :SQLite) {
          console.log('Hello DataServiceProvider Provider')

              this.sqlite.create({name: "data.db", location: "default"}).then((db : SQLiteObject) => {
                      this.database = db;
                  }, (error) => {
                      console.log("ERROR: ", error);
              }); 
    }

}
  

У кого-нибудь есть идея, как это исправить?

Комментарии:

1. Вы используете ionic 4, правильно?

2. Да, я использую 4.12.0

3. И вы тестируете на устройстве, верно?

4. Нет, я тестирую в Chrome и получаю указанную ошибку там.

5. Как вы запускаете проект? ionic serve ?

Ответ №1:

Ваш код не будет работать в браузере при запуске ionic serve , потому что:

Согласно упомянутому здесь

Cordova нужны плагины для запуска в браузере

И они не добавляются по умолчанию. Таким образом, вы можете запустить проект с ionic cordova run browser


ИЛИ, как также упоминалось в комментарии, издевайтесь над плагином. Попробовал это, и это сработало:

в модуле приложения смоделируйте create :

 import { SQLite  , SQLiteDatabaseConfig , SQLiteObject } from '@ionic-native/sqlite';

class SQLiteMock {
public create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
    return new Promise((resolve,reject)=>{
      resolve(new SQLiteObject(new Object()));
    });
  }
} 
  

Отметьте это в поставщиках, таких как:

 {provide: SQLite, useClass: SQLiteMock},
  

Создайте в папке file sql.js файл и скопируйте содержимое отсюда: https://raw.githubusercontent.com/kripken/sql.js/master/js/sql.js

и добавьте в свой index.html:

 <script src="assets/sql.js"></script>
<script src="build/polyfills.js"></script>
<script src="build/main.js"></script>
  

Теперь ваша функция должна работать просто отлично. Переходя к дальнейшим шагам, я предлагаю вам перейти по ссылке, которую я предоставил перед этим кодом, то есть:https://www.techiediaries.com/mocking-native-sqlite-plugin /

Ответ №2:

Одна вещь, которую вы могли бы изучить, заключается в том, запускается ли конструктор перед асинхронной функцией в вашем коде. Если это так, рассмотрите возможность реализации чего-либо подобного в ngOnInit.

Комментарии:

1. Как мне внедрить ngOnInit в код? Извините, но я совершенно новичок в JS.