Проблема при использовании подписок AWS Appsync с Node JS и EJS

Это мой первый вопрос, и я недавно начал писать код Node JS. Сейчас я использую NodeJS и EJS как шаблонизатор для моего приложения. Моя база данных - DynamoDB, и я хотел создать одну таблицу в реальном времени, используя AWS Appsync. Используя Appsync, я могу запрашивать и изменять поля в моей таблице, но не могу подписаться на какие-либо мутации. Нет также открытых веб-сокетов MQTT, когда я звоню по подписке.

Я попытался следовать примеру подписки Appsync на документацию Appsync, но, похоже, это не сработало.

Примечание: я уже определил свою переменную infoID, информация о типе {} создается в схеме, и обе команды mutate и query работают. Просто подписка не работает, и в шаблоне не создается веб-сокет MQTT (возможно ли это даже с помощью 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 ответа

Похоже, вы успешно подключены к AppSync, если вы можете выполнять мутации и запросы из своего приложения. Чтобы устранить проблему с подпиской, вам нужно будет посмотреть сетевой ответ на запрос. Служба отправит сообщение об ошибке, если что-то настроено неправильно.

Одна общая вещь, чтобы проверить, является ли subscription определяется в вашей схеме.

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

В этом случае сообщение об ошибке, которое вы получите при оформлении запроса на подписку: Schema is not configured for subscriptions.

Вот пример кода, как вызвать подписку:

// 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);

Надеюсь, это будет полезно для вас.

Другие вопросы по тегам