2016-09-29 29 views
5

Sunucum, http://dev.apollodata.com/tools/apollo-server/setup.html numaralı telefondan Apollo belgelerine göre ayarlanmış gibi görünüyor.Abonelikler-aktarım-ws ile Apollo Server Kurulumu?

//SET UP APOLLO INCLUDING APOLLO PUBSUB 
const executableSchema = makeExecutableSchema({ 
    typeDefs: Schema, 
    resolvers: Resolvers, 
    connectors: Connectors, 
    logger: console, 
}); 

const GRAPHQL_PORT = 8080; 
const graphQLServer = express(); 

// `context` must be an object and can't be undefined when using connectors 
graphQLServer.use('/graphql', bodyParser.json(), apolloExpress({ 
    schema: executableSchema, 
    context: {}, //at least(!) an empty object 
})); 

graphQLServer.use('/graphiql', graphiqlExpress({ 
    endpointURL: '/graphql', 
})); 

graphQLServer.listen(GRAPHQL_PORT,() => console.log(
    `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}/graphql` 
)); 
//SET UP APOLLO INCLUDING APOLLO PUBSUB 

Bu sunucu başarıyla başlatıldı belirten terminali günlüğüne "GraphQL Sunucu şimdi http://localhost:8080/graphql çalışıyorsa" yazdırır: benim sunucu/main.js dosyasında. ws' olarak

WebSocket bağlantısı:

import { Client } from 'subscriptions-transport-ws'; 
const wsClient = new Client('ws://localhost:8080'); 

... Bu konsol mesajı alıyorum:

Ama main_layout bileşeninin üst, ben bu kodu çalıştırdığınızda en

// localhost : 8080/'başarısız oldu: Bir el sıkışma yanıtı almadan önce bağlantı kapatıldı

Neyi eksik?

cevap

4

Özel bir web sunucusu sunucusu oluşturmanız gerekir. Farklı bir bağlantı noktasında çalışacak ve ayarlanacak kod subscriptions-transport-ws paketinde sağlanıyor.

GitHunt-API örnekten aşağıdaki kodu bir göz atın: https://github.com/apollostack/GitHunt-API/blob/master/api/index.js#L101-L134

Ayrıca bu kod SubscriptionManager adında bir sınıfa bağlı olduğunu görecekti. Bu Apollo ekibi tarafından da graphql-subscriptions adında bir paketten bir sınıftır ve buradan nasıl kullanılacağına dair bir örnek bulabilirsiniz: Burada https://github.com/apollostack/GitHunt-API/blob/master/api/subscriptions.js

+0

Eğer GitHunt-API/API/index.js vurgulamak kod, şema başvurusu etmez ve Apollo dokümanlar şema sunucusu kurmak başvurulan alınması gerektiğini ileri sürdüler. Şema, vurgulanan kodun yukarısında, 66 numaralı satırda başvuruyor, ancak bu, çoğunlukla GitHub API'siyle ilgilenen farklı bir bağlantı noktasındaki bir dinleyici içindir. GitHub'a atıfta bulunmak için port 3010 kodunu değiştirmem gerektiğini söylemek doğru olur mu? – VikR

+0

Abonelikler kurmak istiyorsanız (şu anda oldukları gibi), SubscriptionManager yapıcısına (cevabımın son bölümünde işaret ettiğim) ve bu durumda, sırası gelecektir, bir şema nesnesine ihtiyacınız olacaktır. Server sınıfına "subscriptions-transport-ws" paketinden verilebilir. Yukarıdaki referans, yalnızca mutasyonlara ve sorgulara hizmet eden GraphQL POST bitiş noktasıyla ilgilidir. Tüm bu konfigürasyonlardan sonra, farklı portlarda iki sunucuyla, biri GraphQL uç noktasıyla, diğeri de istemciye olayları itmek için websocket için kalacaksınız. – davidyaha

+0

Adanmış bir web bağlantı noktası gerekli değildir - cevabımı görün. – antirealm

3

TL GitHunt-Tepki daha daha az boğulmuş var; DR: Sen abonelikleri yukarı ve hazır destekleyen ile graphql-up hızlı bir şekilde GraphQL sunucu almak için kullanabilirsiniz. Bunu, Apollo ve websocket istemcisi subscriptions-transport-ws ile birlikte kullanmayla ilgili daha fazla detailed tutorial.

type Tweet { 
    id: ID! 
    title: String! 
    author: User! @relation(name: "Tweets") 
} 

type User { 
    id: ID! 
    name: String! 
    tweets: [Tweet!]! @relation(name: "Tweets") 
} 

graphql-up

tıklayın Kendi GraphQL API almak için bu düğmeye:

Diyelim ki bu GraphQL Schema in IDL syntax dayalı bir Heyecan klonu oluşturmak istediğimizi varsayalım tek bir tıklama

ile GraphQL Sunucusu elde ve daha sonra bazı tweet'leri ekleyebileceğiniz, tüm tweet'leri sorgulayabileceğiniz ve ayrıca abonelikleri test edebileceğiniz Playground'u açın. ,

İlk API kullanmak en tüm gelen tweets için yazar olacak bir kullanıcı oluşturmak izin

basit.Oyun bu mutasyonu çalıştırın:

query allTweets { 
    allTweets { 
    id 
    title 
    createdAt 
    author { 
     id 
     name 
    } 
    } 
} 

Abonelik desteği kullanarak WebSockets

yeni tweets abone şimdi yapalım: Eğer GraphQL sunucuda depolanan tüm tweet'leri ve bunların yazarları sorgulamak nasıl

İşte
mutation createUser { 
    createUser(name: "Tweety") { 
    id # copy this id for future mutations! 
    } 
} 

var "Tweety" den.

subscription createdTweets { 
    Message(filter: { 
    mutation_in: [CREATED] 
    node: { 
     author: { 
     name: "Tweety" 
     } 
    } 
    }) { 
    node { 
     id 
     text 
     createdAt 
     sentBy { 
     id 
     name 
     } 
    } 
    } 
} 

Şimdi Oyun yeni bir sekme oluşturmak ve yeni bir Tweet oluşturmak:

mutation createTweet { 
    createTweet(
    title: "#GraphQL Subscriptions are awesome!" 
    authorId: "<id-from-above>" 
) { 
    id 
    } 
} 

Daha önce abone nerede yeni bir olay diğer sekmede haşhaş görmelisiniz Bu sözdizimi.

1

Gerçekten de websocket sunucusunu yapmadığınız gibi görünüyor. SubscriptionServer kullanın. Davidyaha'nın dediği gibi adanmış bir internet bağlantı noktasına sahip olmanızın (bunu bir kez de düşündüm) kesinlikle doğru OLMADIĞINI unutmayın. Aynı bağlantı noktasında hem normal sorgularım hem de alt bölümlerim var.

import { createServer } from 'http'; 
import { SubscriptionServer } from 'subscriptions-transport-ws'; 
import { execute, subscribe } from 'graphql'; 
import { schema } from './my-schema'; 

// All your graphQLServer.use() etc setup goes here, MINUS the graphQLServer.listen(), 
// you'll do that with websocketServer: 

// Create WebSocket listener server 
const websocketServer = createServer(graphQLServer); 

// Bind it to port and start listening 
websocketServer.listen(3000,() => console.log(
    `Server is now running on http://localhost:3000` 
)); 

const subscriptionServer = SubscriptionServer.create(
    { 
    schema, 
    execute, 
    subscribe, 
    }, 
    { 
    server: websocketServer, 
    path: '/subscriptions', 
    }, 
);