1. const request = require('request')
2.
3. url = 'https://lidemy-book-store.herokuapp.com/books' // 也可以設成API_ENDPOINT
4.
5. request( url, listTenBooks)
6.
7. function listTenBooks(error, response, body) {
8. /* request() 出錯:通常是發送的過程有問題,然後沒有接到任何回應。 */
9. if (error) {
10. console.log(`請求錯誤: ${error}`)
11. return
12. }
13.
14. // 程式碼先處理Status Code 的4xx 5xx,都順利
15. if (response.statusCode >=300) {
16. console.log(`請求錯誤,狀態碼:${response.statusCode}`)
17. return
18. }
19.
20. /* 處理 API Link 的資料:有沒有抓到 API 文件 */
21. let json = {};
22. try {
23. json = JSON.parse(body) // 把 json 格式的字串 -> JavaScript 的 object 形式
24. } catch (error) {
25. console.log('error!!! 資料解析錯誤')
26. console.log('ERROR:', error)
27. return
28. }
29.
30. /* 印出書目上有哪些書 */
31. for (let i = 0; i < 10; i++) {
32. console.log(json[i].id, json[i].name)
33. }
34. }
後記整理:
catch error 的地方有三個:
- request() 有沒有給出錯誤
- 發出 request 後,得到的 response statuscode 有沒有 4xx 5xx
- 有沒有順利抓到資料:json.parse 有沒有出錯
Q1: request() 給出錯誤與 Status Code 4xx 5xx 錯誤不一樣。
Ans.
request() 給出錯誤:通常是在發送的過程有問題,然後沒有接到任何回應。
Status Code 4xx 5xx 錯誤: request 有發送出去,然後 response 得到的 status code
Q2: try catch 不用列出可能是哪些問題
問題描述:先前在 line 30 上列出 json.parse 轉換錯誤的問題:可能是 API 不符合 json 格式或者無法使用 API 文件內的資料,可能是沒有權限訪問該頁面或瀏覽器本版錯誤等問題
Ans.
通常都是列出 error,再個別自己去找 statusCode 顯示的問題。
舉例是 status code 4xx 5xx 有很多問題要處理,不用一一列出來,使用 console.log('ERROR!!:', response.statusCode)
即可
Q3: 可以跑到這個 parsing 的地方代表一定有抓到資料,如果有權限或是其它問題的話應該是要在上面提到 Status Code 的地方處理
24. catch (error) {
console.log(' (2) 網址有效,但無法使用 API 文件內的資料,可能是沒有權限訪問該頁面或瀏覽器本版錯誤等問題')')}
Ans.
所以處理優先順序
(1) <line 15~17> statusCode 判讀 400 500, console.log(statuscode) 後 return 結束 function
(2) <line 22~28> json.parse 抓資料