module.exports = `
type A {
_id: String!
Aprop1: String
Aprop2: String
Aprop3: [B]
}
type b {
_id: String!
Bprop1: String
Bprop2: [C]
}
...
`
module.exports = `
type C {
_id: String!
Cprop1: String
Cprop2: [D]
}
type D {
_id: String!
Dprop1: String
Dprop2: [A] // 두둥...!
}
...
`
URI 중심으로 데이터의 CRUD 진행
Query와 Mutation으로 데이터의 CRUD를 진행
...
// server.js
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express'
import schema from './graphql'
app.use('/graphql', cors(), bodyParser.json(), graphqlExpress({ schema }))
app.use('/graphiql', cors(), graphiqlExpress({ endpointURL: '/graphql' }))
...
// graphql/index.js
import { makeExecutableSchema } from 'graphql-tools'
import typeDefs from './typeDefs' // 타입 정의
import resolvers from './resolvers' // 정의된 타입 구현
export default makeExecutableSchema({ typeDefs, resolvers })
// graphql/typedef.js
module.exports = `
scalar Date // 다른 타입에 대해서는 Date와 같이 scalar로 정의
type News { // DB에서 가져올 타입은 scalar없이 정의.
_id: String! // graphql의 기본 데이터 형은 String과 Int 두개
context: String // !는 requied
image: String
is_ok: Int!
crt_dt: Date!
udt_dt: Date!
}
type Query {
newsList: [News]
}
`
// graphql/resolver.js
import { getNewsList } from '../modules/news'
module.exports = {
Query: {
newsList: () => getNewsList()
}
}
// modules/news.js
// API에서 쓰던 모듈과 같음
// MongoDB 조회. 끝.
export function getNewsList () {
return News.find({is_ok: 1}).sort({crt_dt: -1})
}
// apollo-provider.js
import Vue from 'vue'
import VueApollo from 'vue-apollo'
import {HttpLink} from "apollo-link-http/lib/index"
import {ROOT_URL} from "./config"
import {InMemoryCache} from "apollo-cache-inmemory/lib/index"
Vue.use(VueApollo)
// This can hold multiple apollo clients
const apolloProvider = new VueApollo({
defaultClient: new ApolloClient({
link: new HttpLink({uri: `${ROOT_URL}/graphql`}),
cache: new InMemoryCache(),
connectToDevTools: true
}),
defaultOptions: {
$loadingKey: 'loading'
}
})
export default apolloProvider
// main.js
...
import apolloProvider from './apollo-provider'
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
provide: apolloProvider.provide(), // Provider 주입
store,
template: ' ',
components: { App }
})
// container/News.vue
...
<template>
...
<li v-for="(news, index) in newsList" :key="index">
...
</li>
...
</template>
<script>
import apollo from '../graphql/news'
...
export default {
apollo, // apollo news 모듈
data () {
return {
newsList: [],
...
}
},
...
}
</script>
...
// graphql/news.js
import gql from 'graphql-tag'
export default {
newsList: {
// 가져올 column만 명시.
query: gql`query NewsList {
newsList {
_id
context
image
}
}`,
result ({ data, loader, networkStatus }) {
console.log('We got some result!')
},
// Error handling
error (error) {
console.error('We\'ve got an error!', error)
},
loadingKey: 'loading'
}
}
export default {
module: {
rules: [
// ...
{
test: /\.(graphql|gql)$/,
exclude: /node_modules/,
loader: 'graphql-tag/loader'
}
]
}
}