Проблема при использовании подписок 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);
Надеюсь, это будет полезно для вас.