使用带有Node JS和EJS的AWS Appsync订阅时遇到问题

时间:2018-04-22 11:21:18

标签: javascript node.js ejs aws-appsync

这是我的第一个问题,我最近刚开始编写Node JS代码。现在我使用NodeJS和EJS作为我的应用程序的模板引擎。我的数据库是DynamoDB,我想通过使用AWS Appsync将表格变为Realtime。使用Appsync,我可以查询和改变我的表中的字段,但我似乎无法订阅任何突变。当我打电话给我的订阅时,也没有打开任何MQTT websockets。

我尝试在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);
  });

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

2 个答案:

答案 0 :(得分:2)

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

要检查的一个常见问题是您的架构中是否定义了subscription

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

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

答案 1 :(得分: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);

希望这对您有所帮助。