背景
這個問題最初是在 8 月份發(fā)現(xiàn)的,當時寫完文章準備同步到簡書的時候發(fā)現(xiàn)圖片上傳一直失敗,打開 F12 一看是 獲取七牛云 token 這個接口返回了空數(shù)據(jù):
{"token":"","key":"upload_images/12345678-xxxxxxxxxxx"}
沒有有效的 token 圖片自然就無法上傳到 七牛云 了。想著這么簡單的問題應該很快就能解決就沒去管它了。

結果,一個月過去了還是不能上傳,但是發(fā)現(xiàn)首頁一些新發(fā)布的文章都是帶圖片的,說明我的問題只是個例,或者是手機上傳有不同的接口?
又過了幾天,抱著試一試的心態(tài)上傳圖片,結果突然就好了。( 此時問題實際上仍未修復 )
問題復現(xiàn)
截止 2023 年 11 月,這個問題應該是修復了,暫時沒法復現(xiàn),本文僅用于記錄。
最近正好打算做一個類似于 Wechatsync 的文章同步工具,先拿簡書接口試試手,代碼噼里啪啦一頓寫,一運行才發(fā)現(xiàn)接口跑不通,也是納悶了,明明瀏覽器上剛跑了沒問題的。
接口掛了就掛了,給個錯誤信息就好了,偏偏還返回了一個完整的 JSON ,字段名都有,字段值卻是一個空字符串,導致我一度懷疑是 Axios 的鍋。。。
測試了下面幾種情況:
- 瀏覽器 - Fetch
- 瀏覽器 - Ajax
- 命令行 - curl
- Postman
- Node.js 原生網(wǎng)絡請求 API
想不通為什么最后兩種情況接口訪問會出錯,直到用 curl 調試( -v )時才發(fā)現(xiàn)問題:域名解析后的 IP 地址是 IPv6 格式的。

禁用了網(wǎng)卡屬性中的 IPv6 協(xié)議,果然瀏覽器上也出錯了。
解決方法
切換為支持 IPv6 的網(wǎng)絡,目前手機網(wǎng)絡應該都支持 IPv6 了吧,可以開個熱點給電腦試試。
檢測方法:
-
使用 IPv6 格式的 IP [2408:4001:f30::221] 訪問簡書
切換網(wǎng)絡后不生效可以試下:
-
禁用后再啟用網(wǎng)卡屬性中的 IPv6 協(xié)議
網(wǎng)絡和共享中心 -> 更改適配器設置 -> 右鍵網(wǎng)卡屬性 -> 勾選 / 取消勾選 Internet 協(xié)議版本 6 (TCP/IPv6)
-
刷新 DNS 緩存
ipconfig /flushdns
在 Node.js 中設置 IPv6 訪問優(yōu)先( 參考 )
import * as dns from 'node:dns';
export function useIpv6First() {
dns.setDefaultResultOrder('verbatim');
}
export function useIpv4First() {
dns.setDefaultResultOrder('ipv4first');
}
Node.js 從
v17.0.0版本起,verbatim選項的默認值改為true,也就是默認優(yōu)先 IPv6 。( 參考 )
getDefaultResultOrder API 在舊版本 Node.js 中不支持,代替方案是手動指定一種模式為 默認值 ,想要還原的時候切換回這種模式即可。
其他
-
為什么要做一個 文章同步的工具
由于文章不是首發(fā)在簡書上的( 其他平臺也是一樣 ),同步過來難免要重新上傳外鏈圖片,但是圖片一多就老是會上傳失敗。上傳失敗就算了,還把原文內容替換成 [圖片上傳失敗...(image-xxxxx)] 的做法屬實有點惡心了,一篇幾萬字的文章如果格式被破壞了想想就頭大。而每次手動一張張圖片替換也沒那個時間,干脆寫個小工具做自動轉換。
-
簡書上傳圖片會被壓縮失真怎么辦
親測圖片文件名后綴改為 gif 就可以阻止壓縮了。( 參考 )
最后
回過頭來才想起,家里有好幾個無線路由器,老的路由器不支持 IPv6 而新的路由器支持,平常用的時候也沒注意都是隨機連接的,所以就出現(xiàn)了這個圖片上傳問題時好時壞的現(xiàn)象。
自 IPv6 普及以來,雖然見慣了各種 APP 在開屏廣告上 標注支持 IPv6 ,但還是頭一回感受到它帶來的影響。當然,像簡書這樣“全身心”撲在 IPv6 上,而 IPv4 服務掛了而不自知的應用也是頭一回見。
一款好的產品,它的開發(fā)者必須得是它的重度用戶,否則又怎么能第一時間發(fā)現(xiàn)并解決問題呢?
