2014-02-26 36 views
2

我試圖在Dart中使用sqljocky代碼sql訪問數據庫。由於我想用我的數據庫處理程序返回的結果進行一些計算,該方法返回一個Future。sqljocky查詢沒有方法'然後'(飛鏢數據庫訪問)

但是當我嘗試運行它,我得到了以下錯誤:

Uncaught Error: The null object does not have a method 'then'` 

我已經跑了調試,發現這個錯誤提高對:

db.query('select * from user where email="$email"').then(...) 

但catchError子句不會觸發。

我的處理方法是:

// db is a ConnectionPool 
Future<Map<String,String>> queryUser(String email){ 
    print(email); 
    db.query('select * from user where email="${email}"').then((result) { // here raise the error 
     Map<String,String> results = new Map<String,String>(); 
     result.forEach((row){ 
      results['status'] = '200'; 
      results['ID'] = row[0]; 
      results['Image'] = row[1]; 
      results['Name'] = row[2]; 
      results['Email'] = row[3]; 
      results['Password'] = row[4]; 
     }); 
     return results; 
    }).catchError((error){ 
     Map<String,String> results = new Map<String,String>(); 
     results['status'] = '500'; 
     return results; 
    }); 
} 

並調用此處理程序是方法:

List getUser(String email) { 
    Future<Map<String,String>> result = dbhandler.queryUser(email); 
    result.then((Map<String,String> result) { 
    String statuscode = result['status']; 
    result.remove('status'); 
    String json = JSON.encode(result); 
    List pair = new List(); 
    pair.add(statuscode); 
    pair.add(json); 
    return pair; 
}); 

如果我直接在phpMyAdmin運行查詢,它返回正確的數據,所以它是正確的。

有人可以給我一個關於如何解決它的提示嗎?

回答

1

queryUser()方法將始終返回null,因爲沒有返回語句。在Dart的下一個版本中,會有一個靜態的提示警告,但目前沒有。

也許下面的代碼是你的意思。請注意db.query()之前的初始返回語句以及額外的result.toList()調用。我沒有測試過,所以可能有一兩個錯字。

Future<Map<String,String>> queryUser(String email){ 
    print(email); 
    return db.query('select * from user where email="${email}"') 
     .then((result) => result.toList()) 
     .then((rows) { 
     var row = rows.single; 
     Map<String,String> results = new Map<String,String>(); 
     results['status'] = '200'; 
     results['ID'] = row[0]; 
     results['Image'] = row[1]; 
     results['Name'] = row[2]; 
     results['Email'] = row[3]; 
     results['Password'] = row[4]; 
     return results; 
     }).catchError((error){ 
     Map<String,String> results = new Map<String,String>(); 
     results['status'] = '500'; 
     return results; 
     }); 
} 

您也可以讓這個有點可愛使用地圖文字:

Future<Map<String,String>> queryUser(String email){ 
    return db.query('select * from user where email="${email}"') 
     .then((result) => result.toList()) 
     .then((rows) => <String, String> { 
     'status': '200', 
     'ID': rows.single[0], 
     'Image': rows.single[1], 
     'Name': rows.single[2], 
     'Email': rows.single[3], 
     'Password': rows.single[4] }) 
     .catchError((error) => <String, String> {'status': '500'}); 
} 
+0

由於格雷格,我剛剛解決了它,我會寫我的答案,也可能是別人有幫助的。 –

0

最後我發現用完成者控制未來對象的答案,但真正的問題是正如Greg Lowe所說,我的方法不會返回任何結果,因爲它們在條款之前結束。

使用完成者,我做了我的查詢方法爲:

Future<Map<String,String>> queryUser(String email){ 
    Completer c = new Completer(); 
    db.query('select * from user where email="$email"').then((result) { 
     Map<String,String> results = new Map<String,String>(); 
     result.forEach((row){ 
      results['status'] = '200'; 
      results['ID'] = row[0].toString(); 
      results['Image'] = row[1]; 
      results['Name'] = row[2]; 
      results['Email'] = row[3]; 
      results['Password'] = row[4]; 
     }).then((onValue){ 
      c.complete(results); 
     }); 
    }).catchError((error){ 
     Map<String,String> results = new Map<String,String>(); 
     results['status'] = '500'; 
     c.completeError((e) => print("error en queryUser")); 
    }); 
return c.future; 
} 

使用的foreach方法時,我也解決了一個錯誤,起初我以爲它返回任何結果,但在那之後,我注意到它返回一個Future,所以我添加了一個then子句。

而且我的getUser方法:

Future<List> getUser(String email) { 
    Completer c = new Completer(); 
    Future<Map<String,String>> result = dbhandler.queryUser(email); 
    result.then((Map<String,String> result) { 
     String statuscode = result['status']; 
     result.remove('status'); 
     String json = JSON.encode(result); 
     List pair = new List(); 
     pair.add(statuscode); 
     pair.add(json); 
     c.complete(pair); 
    }); 
    return c.future; 
} 

這些變化後,一切正常,右

+0

該解決方案看起來比@GregLowe更糟糕。你爲什麼不按照他所建議的方式行事?您認爲您的解決方案的優勢是什麼?添加'return'(如建議)與添加'Completer'代碼具有相同的效果。 –

+0

沒有什麼重要的理由可以走我的路,但是,因爲我是Dart的新成員,來自Java,所以我的方式看起來比@GregLowe提供的方式更容易閱讀,所以我想也寫在這裏所以它可以在將來幫助任何人。 –

+0

沒有問題,我只是想知道。 –