2015-05-04 46 views
1

我無法找到與此錯誤和飛鏢有關的任何內容,因此存在問題。未捕獲錯誤:狀態不佳:標頭已發送

在簡單的服務器應用程序中可能會導致此錯誤的原因。

import 'package:auctionprojectServer/auctionprojectServer.dart' as auctionprojectServer; 
import 'dart:io'; 
import 'package:http_server/http_server.dart' show VirtualDirectory; 

VirtualDirectory virDir; 

main() { 
    initVirDir(); 
    runServer(); 
} 


/** 
* Code for virtual directory 
*/ 
initVirDir() { 
    virDir = new VirtualDirectory(r"..\auctionProject\web") // change to build\web after 2js 
    ..allowDirectoryListing = true 
    ..directoryHandler = directoryHandler; 
} 

directoryHandler(dir, request) { 
    var indexUri = new Uri.file(dir.path).resolve('auctionproject.html'); 
    virDir.serveFile(new File(indexUri.toFilePath()), request); 
} 

/* end of virtual directory related code */ 


/** 
* Code to handle Http Requests 
*/ 
runServer() async { 
    var server = await HttpServer.bind('127.0.0.1', 8080).catchError((e) => print(e)); 
    await for (HttpRequest request in server) { 
    handleAnyRequest(request); 
    request.response.close(); 
    } 
} 

handleAnyRequest(HttpRequest request) { 
    switch (request.method) { 
    case 'GET': 
     handleGetRequest(request); 
     break; 
    case 'POST': 
     handlePostRequest(request); 
     break; 
    default: defaultRequestHandler(request); 
    } 
} 

handleGetRequest(HttpRequest req) { 
    print('got GET request'); 
    virDir.serveRequest(req).catchError((e)=> print('annoying error')); // <<< 
} 

handlePostRequest(HttpRequest req) { 
    print('got POST request'); 
} 

// place for other request types 

defaultRequestHandler(HttpRequest req){ 
    print('some unhandled request!!!\n'); 
} 

/* end of code handling Http Requests */ 

註釋掉標有// <<<錯誤消失代碼後。另一方面annoying error從不打印,所以我不確定問題來自哪裏。

控制檯輸出如下所示。

got GET request 
got GET request 
Unhandled exception: 
Uncaught Error: Bad state: Header already sent 
Stack Trace: 
#0  _HttpResponse.statusCode= (dart:io/http_impl.dart:523) 
#1  VirtualDirectory.serveFile.<anonymous closure> (package:http_server/src/virtual_directory.dart:287:16) 
#2  _RootZone.runUnary (dart:async/zone.dart:1155) 
#3  _Future._propagateToListeners.handleError (dart:async/future_impl.dart:515) 
#4  _Future._propagateToListeners (dart:async/future_impl.dart:570) 
#5  _Future._completeWithValue (dart:async/future_impl.dart:358) 
#6  _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:412) 
#7  _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41) 
#8  _asyncRunCallback (dart:async/schedule_microtask.dart:48) 
#9  _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:96) 
#10  _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:143) 

#0  _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:886) 
#1  _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41) 
#2  _asyncRunCallback (dart:async/schedule_microtask.dart:48) 
#3  _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:96) 
#4  _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:143) 

回答

2

我沒有檢查,但我認爲vdir.serveRequest()是異步。

你需要等待此調用

await handleAnyRequest(request); 

,並確保通過vdir.serveRequest返回的未來返回,因此可以期待的。 否則request.response.close();vdir.serveRequest()完成之前調用,從而出現錯誤。

+0

如果我理解正確,handleAnyRequest將需要返回未來,當被調用的請求處理程序完成時。我如何檢查'.serveFile()'是否完成。它沒有回報價值? – Lukasz

+0

你對錯誤的原因肯定是正確的。爲了知道我註釋掉了'request.response.close()'部分。我希望能夠在不久的將來找到解決方案。謝謝。 – Lukasz