рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░ рдПрдХ рд▓рдШреБ рд▓реЗрдЦ рдХрд╛ рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж рдкрдврд╝реЗрдВред рдореВрд▓ рдпрд╣рд╛рдБ (
рдПрди ) рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
GraphQL рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж
GraphQL рдПрдХ рдПрдкреАрдЖрдИ рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╕реЗ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред рдлреЗрд╕рдмреБрдХ рджреНрд╡рд╛рд░рд╛ 2012 рдореЗрдВ рд╡рд╛рдкрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдЕрднреА рднреА рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрдиреНрдп рдмрдбрд╝реА рдФрд░ рдмрд╣реБрдд рдХрдВрдкрдирд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реБрдЖред рджреВрд╕рд░реЛрдВ рдореЗрдВ, рдпреЗрд▓реНрдк, рд╢реЛрдкрд┐рдЗрдЬрд╝ рдФрд░ рдЧреАрдереВрдмред
REST API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдорддреМрд░ рдкрд░ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрддреЗ рдкрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред GraphQL рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдЬреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрддреЗ рдкрд░ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдореЛрдмрд╛рдЗрд▓ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдмрдврд╝рд┐рдпрд╛ рд╣реИред
рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдХрд╛рд╕ рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░рджрд░реНрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред GraphQL рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред GraphQL рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдХреНрд╡реЗрд░реА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдЧреНрд░рд╛рдлрд╝рдХреЙрд▓ рдПрдкреАрдЖрдИ рдореЗрдВ рдирдП рдлрд╝реАрд▓реНрдб рдФрд░ рдкреНрд░рдХрд╛рд░ (рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА) рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкреБрд░рд╛рдиреЗ рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдлрд╝реАрд▓реНрдб рдПрдкреАрдЖрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЫрд┐рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдПрдХрд▓, рд╡рд┐рдХрд╕рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЧреНрд░рд╛рдлрдХреЙрд▓ рдПрдкреАрдЖрдИ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирдП рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рднрд░реНрддреА рдЖрдзрд╛рд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдл рдФрд░ рдЖрд╕рд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╢рд░реНрдд
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг 6 рдФрд░ рдкреБрд░рд╛рдиреЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВред рдЖрдк рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
node -v
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдиреЛрдб рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ URL рдкрд░
рдЬрд╛рдПрдВ :
https://nodejs.org/ рдФрд░ рд╕реНрдерд╛рдкрдирд╛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
GraphQL рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛
рдЧреНрд░рд╛рдл рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ Node.js. рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдврд╛рдВрдЪрд╛ рд╣реИред Npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm init npm install express --save
рдлрд┐рд░ `рдЧреНрд░рд╛рдлрдХрд▓` рдФрд░` рдПрдХреНрд╕рдкреНрд░реЗрд╕-рдЧреНрд░рд╛рдлрдХреНрд▓` рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm install graphql express-graphql --save
рддреЛ, рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА:
|---- node_modules
|---- package.json
GraphQL рдПрдкреАрдЖрдИ рдореЗрдВ рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд
рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рд╕рд░рд▓ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЖрдЧреЗ рдХреЗ рдХрдерди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдП рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рдПрдкреАрдЖрдИ рдХреНрдпрд╛ рд╣реИред рдпрджрд┐ рдХреБрдЫ рдмрд┐рдВрджреБ рдХрдард┐рди рдФрд░ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд▓рдЧреЗрдВрдЧреЗ, рддреЛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рд╣рдо рдЙрдирдХреЗ рдкрд╛рд╕ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред
рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо рд╕реНрдХреАрдорд╛ (`рд╕реНрдХреАрдо ') рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП` buildSchema` рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ' graphql` рд╕реЗ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ example.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред
const express = require('express'); const { buildSchema } = require('graphql'); const graphqlHTTP = require('express-graphql'); let port = 3000; let schema = buildSchema(` type Query { postTitle: String, blogTitle: String } `); let root = { postTitle: () => { return 'Build a Simple GraphQL Server With Express and NodeJS'; }, blogTitle: () => { return 'scotch.io'; } }; const app = express(); app.use('/', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true
рдЕрдм рдЖрдк рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ `example.js` рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
node example.js
рдЕрдм рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░: 3000 рдЖрдк рдЧреНрд░рд╛рдлрд┐рдХреНрд╡реЗрд▓ рдХреА рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рдСрдЯреЛ-рдкреВрд░реНрдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдзрд╛рд░рдгрд╛ рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдм 'blogTitle` рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╕реНрдХреАрдорд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ:

рдЗрддрдирд╛ рд╕рд░рд▓ рдЖрдк рдЧреНрд░рд╛рдлрдХреЙрд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдЪрдп
рдЕрдм рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЧреНрд░рд╛рдлрд╝рдХреЙрдЧ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо рд╡рд┐рд╖рдп рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪрд▓рд┐рдП рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЧреНрд░рд╛рдлрд▓рд╛рдЗрди рд╕рд░реНрд╡рд░ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм, рд╣рдорд╛рд░реЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, `src` рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдФрд░ рдЗрд╕рдореЗрдВ 'рд╕реНрдХреАрдорд╛.рдЬреЗрдПрд╕' рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдФрд░ рд╕рд╣реЗрдЬреЗрдВред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
рдЕрдЧрд▓рд╛, `src` рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ` data` рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБред рд╣рдо рдЗрд╕рдореЗрдВ 2 рдлрд╛рдЗрд▓реЗрдВ рд░рдЦреЗрдВрдЧреЗ: 'Author.js' рдФрд░ 'posts.js'ред
рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЙрдиреНрд╣реЗрдВ
рдЧрд┐рддреБрдм рд╕реЗ рдпрд╛ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд
рд▓рд┐рдВрдХ рдкрд░ рдирд╣реАрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗред
authors.js const Authors = [ { id: '8dlx7ak38fd39dv79ad', name: 'Orinami Olatunji', twitterHandle: '@orinami_' }, { id: 'jd3kd03d0w9a0l35rh74', name: 'Ojima Udale', twitterHandle: '@uncooloj' }, { id: '0hy894hf0dlkfh9oinv', name: 'Xabi Alonso', twitterHandle: '@alonso' } ]; module.exports = Authors;
posts.js const Posts = [ {'id':'0176413761b289e6d64c2c14a758c1c7','author_id':'0hy894hf0dlkfh9oinv','author':'alonso', 'category':'meteor','body':'Most developers and companies use two different apps for the marketing website and for the app itself. Thus, they can update each of the apps without affecting the other. [Stripe](https://stripe.com/), [Digital Ocean](https://www.digitalocean.com/) and many other companies follow this technique. Most Meteor apps also do the same.\n\nSo, in a scenario like this, sometimes we need to show the login state of the app on the landing page too. For an example, see our Kadira home page (\u003chttps://kadira.io\u003e). If you are logged into the Kadira app (\u003chttps://ui.kadira.io\u003e), we show a button with "Open Kadira UI" on the home page, which replaces the login button.\n\n[](https://kadira.io)\n\n## How Did We Do It?\n\nMeteor does not have a built-in way to share login states across multiple apps or subdomains. So, we have to find an alternative way to do so.\n\nAs a solution, we can use browser cookies to share the login state between multiple domains. That\'s exactly what we did. We wrapped this up into a Meteor package, which now you can also use.\n\nIn this guide, I\'m going to explain how to share the login state between multiple domains using the [`kadira:login-state`](https://github.com/kadirahq/meteor-login-state) package.\n\n### On Meteor App\n\nFirst of all, install the `kadira:login-state` package in your Meteor app:\n\n~~~\nmeteor add kadira:login-state\n~~~\n\nThen, you need to add a new entry in the `public` object as the `loginState` in the `settings.json` file for your app. (If you haven\'t created the settings.json yet, you need to create it first.)\n\n~~~json\n{\n "public": {\n "loginState": {\n "domain": ".your-domain-name.com",\n "cookieName": "app-login-state-cookie-name"\n }\n }\n}\n~~~\n\nThe `domain` field must be your main domain name, starting with a dot. It allows you to share the login state, which can be accessed from any of its subdomains. You can use any appropriate identifier, such as `cookieName`.\n\nNow, everything has been set up on the Meteor app.\n\n### On the Static App (the Landing Page)\n\nNow we have to show the login state of the app on the landing page. For this, we need to add support for the login state for the static app (or landing page).\n\nActually, there are three different ways to do this. Here I will show you how to do so by pasting a few lines of JavaScript code.\n\nYou need to create a JavaScript file in your js folder. I create it as `js/login_state.js`. After that, copy and paste the following code snippet into it:\n\n~~~javascript\nLoginState = {};\n\nLoginState.get = function(cookieName) {\n var loginState = getCookie(cookieName);\n if(loginState) {\n return JSON.parse(decodeURIComponent(loginState));\n } else {\n return false;\n }\n};\n\nfunction getCookie(cname) {\n var name = cname + "=";\n var ca = document.cookie.split(\';\');\n for(var i=0; i \u003c ca.length; i++) {\n var c = ca[i];\n while (c.charAt(0)==\' \') c = c.substring(1);\n if (c.indexOf(name) != -1) return c.substring(name.length,c.length);\n }\n return;\n}\n~~~\n\nInsert that file into the head section of your HTML document: \n\n`\u003cscript src="js/login-state.js"\u003e\u003c/script\u003e`\n\n\u003e If you prefer, you can also use [Browserify](https://github.com/kadirahq/meteor-login-state#installing-via-browserify) or [Bower](https://github.com/kadirahq/meteor-login-state#installing-via-bower) to load the above JS file.\n\u003e The package name for both Browserify and Bower is `meteor-login-state`.\n\nThen, use the following code to get the login state of your app. You need to provide the relevant `cookieName` to do so: \n\n~~~javascript\nvar loginState = LoginState.get("app-login-state-cookie-name");\nif(loginState) {\n // the user has loggedIn to the meteor app\n // see the loginState Object for the addtional data\n // (append your code here!)\n console.log(loginState);\n} else {\n // user has not loggedIn yet.\n // (append your code here!) \n}\n~~~\n\nThe `loginState` object will be something like this:\n\n~~~json\n{\n timestamp: 1435835751489,\n username: "username",\n userId: "meteor-user-id",\n email: "user@email.com"\n url: "https://ui.kadira.io"\n}\n~~~\n\nNow you can do whatever you need to do with the login state.\n\nGive it a try and let me know what you think.','date':{'$date':'2015-07-07T00:00:00.000Z'},'layout':'blog_post','slug':'sharing-meteor-login-state-between-sub-domains','summary':'In this blog we\'ll show you how we shared login state between our static web app and our Meteor app Kadira UI.','title':'Sharing the Meteor Login State Between Subdomains'}, {'id':'03390abb5570ce03ae524397d215713b','author_id':'0hy894hf0dlkfh9oinv','author':'alonso', 'category':'product','body':'Here is a common feedback we received from our users:\n\n\u003e Hi, I have a suggestion. It would be great if I could "dismiss" errors or mark them as resolved on my end. This way, I can keep track of which errors I have resolved.\n\nToday we are happy to announce new Kadira feature which allows you to track **status** to errors. With that, you can mark errors as "Ignored", "Fixing" or "Fixed".\n\nOnce you mark an error as "Ignored", it will be hidden. \n\nBut you can click on "Show Ignored Errors" checkbox or filter by "ignored" status to view them again.\n\n\n\nYou can also filter errors by status like this:\n\n\n\nWe are rolling out this feature to all our paid users. [Give it a try](https://ui.kadira.io/apps/AUTO/errors/overview?metric=count).\n\n### What's next?\n\nRight now we are planning to add few more feature related this. Could you help us on [prioritizing](https:
GraphQL
GraphQL 'grapql/type', . 'graphql/type' 'graphql'
ID ,
String ,
Int ,
Float Boolean . (Author). schema.js :
const AuthorType = new GraphQLObjectType({ name: "Author", description: "This represent an author", fields: () => ({ id: {type: new GraphQLNonNull(GraphQLString)}, name: {type: new GraphQLNonNull(GraphQLString)}, twitterHandle: {type: GraphQLString} }) });
, : GraphQLObjectType . Name Description тАФ , Fields Author: id, name twitterHandler.
graphql.org/graphql-js/type/(Post):
const PostType = new GraphQLObjectType({ name: "Post", description: "This represent a Post", fields: () => ({ id: {type: new GraphQLNonNull(GraphQLString)}, title: {type: new GraphQLNonNull(GraphQLString)}, body: {type: GraphQLString}, author: { type: AuthorType, resolve: function(post) { return _.find(Authors, a => a.id == post.author_id); } } }) });
schema.js. PostType, Root Query( тАФ . , GraphQL API).
Root Query
Root Query , . 2 : .
`schema.js`:
const BlogQueryRootType = new GraphQLObjectType({ name: 'BlogAppSchema', description: "Blog Application Schema Query Root", fields: () => ({ authors: { type: new GraphQLList(AuthorType), description: "List of all Authors", resolve: function() { return Authors } }, posts: { type: new GraphQLList(PostType), description: "List of all Posts", resolve: function() { return Posts } } }) });
BlogQueryRootType. , : new GraphQLList(). , .
, , , . , ( ). , , , .
:
const BlogAppSchema = new GraphQLSchema({ query: BlogQueryRootType });
BlogQueryRootType, API.
GraphQL API
`lodash`. `Lodash` , Javascript , , . `underscore`, ! Lodash , underscore.
npm install lodash --save
lodash package.json .
schema.js.
const _ = require('lodash');
schema.js. .
const _ = require('lodash');
PostType, resolve. Resolve , , .. .
BlogAppSchema server.js , module.exports
, server.js :
const express = require('express'); const graphqlHTTP = require('express-graphql'); const schema = require('./src/schema.js'); let port = 3000; const app = express(); app.use('/', graphqlHTTP({ schema: schema, graphiql: true })); app.listen(port); console.log('GraphQL API server running at localhost:'+ port);
localhost:3000. :
node server.js
рдкрд░рд┐рдгрд╛рдо:

graphiql, API . :
{ posts { id title author { name } } }
:

рдирд┐рд╖реНрдХрд░реНрд╖
, . , GraphQL API Express NodeJS. , .
GraphQL
graphql.org .