接口數據總是返回 null 如何回饋和處理


先說結果, 請避免返回 null.

null 是如何產生的

根據 為何后端經常會將一個空數組返回為 null ? 帖子里描述的示例:

這個應該是后端代碼不夠嚴謹吧。比如后端可以加一個判斷,如果 applies 是一個array,但是沒有值,也需要用array,不能使用NULL 等。

測試代碼:

$c;

$arr = array(
    'status' => 1, 
    'data' => array(
        'a' => 111,
        'b' => array(),
        'c' => $c,
        'd' => (empty($c) ? array() : $c)
    )
);

echo json_encode($arr);

輸出

{
  "status": 1,
  "data": {
    "a": 111,
    "b": [],
    "c": null,
    "d": []
  }
}

關於返回 null 的相關討論

為什么不要返回 null

文章 不要再返回Null了 詳細描述了原因. 認為:

Null值不應該由程序員在方法中返回,因為這樣做,一是違背了方法名的語意。二是由於我們返回null值,更加增加了系統的不穩定性;因為在調用者忘記做null檢查時,就一定會因為我們的方法出錯。最后,null值所充斥的系統模型違反了OOP原則。

阿里巴巴 《Java開發手冊》第十章《前后端規約》(第28頁)明確規定:

【強制】前后端數據列表相關的接口返回,如果為空,則返回空數組[]或空集合{}。 說明:此條約定有利於數據層面上的協作更加高效,減少前端很多瑣碎的 null 判斷。

對於便於前后端協作開發, 我們有了接口文檔來規定數據的類型. 前端按規定的類型來操作數據, 例如 array 類型會進行遞歸遍歷操作. 但不知道何時何地會或不會突然變成 null, 那這時候 null 的類型是 array 類型嗎?

拋開 null 會造成語義和類型混亂這些問題, 在前端出會造成數據錯誤, 例如:

/**
 * 獲取數組的長度
 * @param {array} arr 數組
 * @returns {number}
 */
 function getLength(arr = []) { // 前端已經做了默認值處理
  return arr.length
}
getLength([1,2,3]) // 3
getLength(null) // 但還是導致程序崩潰 Uncaught TypeError: Cannot read property 'length' of null


/**
 * 獲取數據中兩個整數的和
 * @param {object} param0 {data: {a, b}}
 * @param {number} param0.data.a 整數a
 * @param {number} param0.data.b 整數b
 * @returns {number}
 */
function add({data: {a = 0, b = 0}} = {}) { //
  return parseInt(a) + parseInt(b)
}
add({data: {a: 1, b: 2}}) // 3
add({data: {a: null, b: 2}}) // NaN 不符合預取的 0+2


/**
 * 獲取兩個對象的 key
 * @param {*} param0 {obj1, obj2}
 * @returns {array}
 */
function getKeys({obj1 = {}, obj2 = {}}) {
  return Object.keys(obj1).concat(Object.keys(obj2))
}
getKeys({obj1: {a: 1}, obj2: {b: 2}}) // ["a", "b"]
getKeys({obj1: {}, obj2: {b: 2}})  // ["b"]
getKeys({obj1: undefined, obj2: {b: 2}})  // ["b"]
getKeys({obj1: undefined, obj2: {b: 2}})  // ["b"]
getKeys({obj2: {b: 2}})  // ["b"]
getKeys({obj1: null, obj2: {b: 2}})  // Uncaught TypeError: Cannot convert undefined or null to object


function getStr(str = ``) {
  return str + `你好`
}
getStr(null) // "null你好"

參考:

// JSON.parse(JSON.stringify({
//   a: 1,
//   b: undefined,
//   c: {
//     a: null,
//     b: [null],
//     c: {
//       a: null,
//       b: 134,
//     }
//   },
// }), (key, value) => {
//   return value === null ? undefined : value
// }
// )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM