慕仙森
2023-05-25 17:13:50
我知道您可以將模式中的參數設置為默認值,但是否可以limit在我的 GraphQL 模式中使參數參數完全可選?現在看來,當我在沒有指定限制的情況下點擊它時,我想這就是我得到的原因Int cannot represent non-integer value: undefinedconst schema = buildSchema(`
companies(limit: Int): [Company]
...)我希望能夠跳過限制,以便獲得所有公司。在 JS 中,我這樣稱呼它:query: `query {
companies(limit: ${limit}) {
...但有時我不想指定限制。所以發生的事情是客戶端正在發送crafters(limit: undefined)并且它可能正在嘗試將其轉換為 Int。我不確定如何不發送limit以及如何使整個參數可選。(我還從客戶那里讀到,我應該將參數指定為變量,就像query($limit: Int) { companies(limit: $limit) {我從我的客戶那里猜測的那樣,來自JS?如果是這樣,我將如何將我的 limit JS 變量發送到其中?
2 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
默認情況下,GraphQL 中的參數可以為空(即可選)。因此,如果您的類型定義如下所示:
companies(limit:?Int):?[Company]
您不需要做任何其他事情就可以成為limit
可選的——它已經是了。如果你想成為必需的,你可以通過將 a 附加到這樣的類型來limit
使其不可為空:!
companies(limit:?Int!):?[Company]
您看到的錯誤與參數類型無關limit
。問題在于您發送的查詢,根據錯誤消息,它看起來像這樣:
query?($limit:?Int){ ??companies?(limit:?undefined)?{ ????#?... ??} }
這里有兩個問題:第一,您正在定義一個變量($limit),您實際上從未在查詢中使用它(如第二個錯誤所示)。第二,您將限制設置為undefined
,這不是 GraphQL 中的有效文字。
您應該使用變量將任何動態值傳遞給您的查詢,而不是使用字符串插值。例如:
query?($limit:?Int){ ??companies?(limit:?$limit)?{ ????#?... ??} }
如果變量可以為空(注意我們使用Int
而不是Int!
),那么它可以從請求中完全省略,有效地使參數的值在服務器端未定義。

函數式編程
TA貢獻1807條經驗 獲得超9個贊
下面是一個示例,說明如何在客戶端上定義查詢并傳遞非必需參數。不確定您的客戶端配置,但您可能想使用像 graphql-tag 這樣的庫將字符串轉換為 AST。
const GET_COMPANIES = gql`
query Companies($limit: Int) {
companies(limit: $limit) {
... // return fields
}
}
`;
添加回答
舉報
0/150
提交
取消