4

这是我在这里的第一个问题,我最近才开始编写 Node JS 代码。现在我正在使用 NodeJS 和 EJS 作为我的应用程序的模板引擎。我的数据库是 DynamoDB,我想通过使用 AWS Appsync 来制作一个实时表。使用 Appsync,我可以查询和更改表中的字段,但我似乎无法订阅任何更改。当我调用订阅时,也没有打开任何 MQTT websocket。

我尝试按照 Appsync 文档中的 Appsync 订阅示例进行操作,但它似乎不起作用。

注意:我已经定义了我的 infoID 变量,类型信息{} 是在模式中创建的,mutate 和 query 都可以工作。只是订阅不起作用,并且没有在模板上创建 MQTT websocket(这甚至可以使用 NodeJS 和 EJS 吗?)。

我的架构如下:

type Mutation {
	deleteInfo(infoID: String!): information
}

type Subscription {
	onDeleteInfo(infoID: String): information
		@aws_subscribe(mutations: ["deleteInfo"])
}

而我用来查询和订阅的代码是这样的:

const query = gql(`
  query($infoID: String!){
          getInformation(infoID: $infoID) {
            infoID
            noOfDays
            noOfItems
            infoName
   }
           
  }`);

  // Set up a subscription query
  const subquery = gql(`
  subscription ($infoID: String) {
  onDeleteInfo(infoID: $infoID) {
    infoID
    noOfDays
    noOfItems
    infoName
  }
  }`);

  const client = new AWSAppSyncClient({
    url: url,
    region: region,
    auth: {
        type: type,
        credentials: credentials,
    }
});

client.hydrated().then(function (client) {
    //Now run a query
    client.query({ query: query, variables: {infoID : infoID} })
        .then(function logData(data) {
            console.log('results of query: ', data);
            var responseData = data;
            res.send(responseData);
        })
        .catch(console.error);

    //Now subscribe to results
    const realtimeResults = function realtimeResults(data) {
            console.log('realtime data: ', data);
            console.log('subcribe is called');
        };

    const observable = client.subscribe({
              query: subquery,
              variables: {infoID : infoID} });

    observable.subscribe({
              next: realtimeResults,
              complete: console.log,
              error: console.log
          });
 };         

我的突变代码是:

const mutation = gql(`
    mutation($infoID: String!){
            deleteInfo(infoID: $infoID) {
              infoID
              noOfDays
              noOfItems
              infoName
             }
    }`);

  const client = new AWSAppSyncClient({
    url: url,
    region: region,
    auth: {
        type: type,
        credentials: credentials,
    }
  });

  client.hydrated().then(function (client) {
      //Now run a query
      client.mutate({ mutation: mutation, variables:{infoID: infoID} })
          .then(function logData(data) {
              console.log('results of mutate: ', data);
          })
          .catch(console.error);
  });

感谢任何回答或阅读或以任何方式提供帮助的人!

4

2 回答 2

3

如果您可以从您的应用程序进行突变和查询,听起来您已成功连接到 AppSync。要调试订阅问题,您需要查看请求的网络响应。如果设置不正确,该服务将发送错误消息。

要检查的一件常见事情是 是否subscription在您的架构中定义。

schema {
    query: Query
    mutation: Mutation
    subscription: Subscription
}

如果是这种情况,您在发出订阅请求时将收到的错误消息是:Schema is not configured for subscriptions.

于 2018-05-23T18:53:29.223 回答
0

以下是如何调用订阅的示例代码片段:

// Set up a subscription query
const subquery = gql`
	subscription onAccept {
		onUpdateDeveloperJob(developerId: "ce261427-84ad-450b-91d1-83b78532dfe6") {
			id
			jobId
			developerId
			selected
		}
	}
`;

// Set up Apollo client
const client = new AWSAppSyncClient({
	url,
	region,
	auth: {
		type,
		apiKey
	}
});

client
	.hydrated()
	.then(appsyncClient => {
		// Now run a query
		// appsyncClient
		// 	.query({ query })
		// 	.then(data => {
		// 		console.log('results of query: ', data);
		// 	})
		// 	.catch(console.error);

		// Now subscribe to results
		const observable = appsyncClient.subscribe({ query: subquery });
		const realtimeResults = function realtimeResults(data) {
			console.log('realtime data: ', data);
		};
		observable.subscribe({
			next: realtimeResults,
			complete: console.log,
			error: console.log
		});
	})
	.catch(console.error);

希望这对您有所帮助。

于 2018-08-04T19:34:53.140 回答