Apollo-link: WebSocketLink๊ฐ€ ๊ตฌ์„ฑ๋œ ํ›„์—๋Š” ๊ตฌ๋… ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 05์›” 17์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: apollographql/apollo-link

์›น ์†Œ์ผ“์— ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) ์ƒˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  connectionParams ๋กœ WebSocketLink ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    const wsLink = new WebSocketLink({ 
      uri: `ws://localhost:3333`, 
      options: { 
        connectionParams: {
          lazy: true,
          authToken: localStorage.getItem('token')
        }
      } 
    });

์ด ์‹œ์ ์—์„œ ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ํ† ํฐ์ด ์—†์Šต๋‹ˆ๋‹ค. lazy ๊ฐ€ true๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— websocket๋„ ์•„์ง ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ํ›„ ์ฒซ ๋ฒˆ์งธ ๊ตฌ๋…์ด ์ „์†ก๋  ๋•Œ๊นŒ์ง€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๊ณ  ์—ฐ๊ฒฐ๋˜๋ฉด ์ด ๊ฐ’์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ํ›„๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ์„ฑ๋  ๋•Œ ์„ค์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— authToken ๋Š” null์ž…๋‹ˆ๋‹ค.

    subscriptionServer.onConnect = params => {
      console.log('connected: ', params.authToken) // null
    }

์ฟผ๋ฆฌ ๋ฐ ๋ณ€ํ˜•์€ ์—ฐ๊ฒฐ ๋งํฌ๋ฅผ ํ†ตํ•ด ์Šน์ธ๋ฉ๋‹ˆ๋‹ค.

const httpLink = new HttpLink({ uri: GRAPHQL_ENDPOINT })
const authLink = new ApolloLink((operation, forward) => {
    const token = localStorage.getItem('token')
    if (token) {
        operation.setContext({
            headers: {
                authorization: `bearer ${token}`
            }
        })
    }
    return forward(operation)
})

const httpAuthLink = authLink.concat(httpLink)

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ํ›„ ์š”์ฒญ์ด ์ „์†ก๋˜๋ฉด token ๊ฐ€ authorization ํ—ค๋”์— ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WebSocketLink ์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฌธ์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๊ธฐ ์ „์— ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ํ† ํฐ์„ ์ฝ๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ๋ง๊ณ  ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

connectionParams: () => ({
          lazy: true,
          authToken: localStorage.getItem('token')
        })

๋ชจ๋“  3 ๋Œ“๊ธ€

์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‹๋ณ„๋˜๊ณ  ํ† ํฐ์ด ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๋ฉด window.location = '/' ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์นฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋„ˆ๋ฌด ๋”๋Ÿฝ๋‹ค๋ฉด.

์ถ”๊ฐ€์— ๋Œ€ํ•œ ์–ด๋–ค ์ƒ๊ฐ onConnecting ๋ฐ onDisconnect ์ƒ์„ฑ์ž์— ๋ฐฉ๋ฒ•์„ options ์˜ WebSocketLink ? ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์น  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

const wsLink = new WebSocketLink({ 
      uri: `ws://localhost:3333`, 
      options: { 
        onConnecting: () => {
                // Invoked just before the Socket initially connects
                // returns additional connection params
                return  {
                   authToken: localStorage.getItem('token')
               }
        },
        onDisconnect: () => {
                // Invoked when the socket is disconnected
       }
      } 
    });

๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ๋ง๊ณ  ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

connectionParams: () => ({
          lazy: true,
          authToken: localStorage.getItem('token')
        })

@gpbaculio ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰