跳到主要内容

原始查询和订阅

虽然 @blocklet/server-js 库为大多数常见的 GraphQL 操作提供了便捷的辅助方法,但在某些情况下,您可能需要更大的灵活性或访问 SDK 尚未公开的功能。对于这些高级用例,该库允许您直接执行原始 GraphQL 查询和订阅。

当您需要构建高度特定的查询、在官方封装之前访问最新的 API 功能,或者优化数据获取超出标准方法所能提供的范围时,这种方法是理想的选择。

原始查询

doRawQuery 方法使您能够将任何有效的 GraphQL 查询字符串发送到 Blocklet Server API 端点。这使您可以完全控制所请求的数据及其结构。

  • query string (required) — 要执行的原始 GraphQL 查询字符串。
  • requestOptions object — 可选对象,用于高级请求配置,例如自定义标头。

示例

以下是如何使用 doRawQuery 来获取有关已连接节点的基本信息。

doRawQuery Example

javascript
import BlockletServerClient from '@blocklet/server-js';

const client = new BlockletServerClient();

async function getNodeVersion() {
  try {
    const query = `{
      getNodeInfo {
        info {
          version
          name
        }
      }
    }`;

    const result = await client.doRawQuery(query);
    console.log('Node Name:', result.getNodeInfo.info.name);
    console.log('Node Version:', result.getNodeInfo.info.version);
  } catch (error) {
    console.error('Failed to execute raw query:', error);
  }
}

getNodeVersion();

响应示例

Response Data

json
{
  "getNodeInfo": {
    "info": {
      "version": "1.8.22",
      "name": "My Dev Node"
    }
  }
}

此方法返回一个 Promise,该 Promise 会解析为 GraphQL 服务器返回的确切 JSON 数据,从而允许您直接访问嵌套属性。

原始订阅

对于实时数据更新,您可以使用 doRawSubscription 方法建立持久连接并监听服务器推送的事件。与标准查询不同,此方法返回一个订阅对象,允许您注册事件监听器。

  • query string (required) — 原始 GraphQL 订阅字符串。

示例

此示例演示了如何订阅 Blocklet 状态更改。每当 Blocklet 的状态更新时(例如,从“正在运行”到“已停止”),订阅将推送新数据。

doRawSubscription Example

javascript
import BlockletServerClient from '@blocklet/server-js';

const client = new BlockletServerClient();

async function watchBlockletStatus() {
  try {
    const subscriptionQuery = `subscription {
      blockletStatusChanged {
        did
        status
      }
    }`;

    const subscription = await client.doRawSubscription(subscriptionQuery);

    subscription.on('data', (data) => {
      const { did, status } = data.blockletStatusChanged;
      console.log(`Blocklet ${did} status changed to: ${status}`);
    });

    subscription.on('error', (err) => {
      console.error('Subscription error:', err);
    });

    console.log('Listening for blocklet status changes...');
  } catch (error) {
    console.error('Failed to start subscription:', error);
  }
}

watchBlockletStatus();

数据流示例

当 Blocklet 的状态发生变化时,data 事件监听器将收到如下所示的负载:

Streamed Data

json
{
  "blockletStatusChanged": {
    "did": "z8iZpA6x3M4Jz3J6iK9y6L4oE3nF2aH5c8g7",
    "status": "stopped"
  }
}

当标准辅助方法无法满足您的特定需求时,使用原始查询和订阅提供了一种与 Blocklet Server API 交互的强大方式。要对您的原始查询或任何其他客户端交互进行故障排除,请转到下一节 调试