Ссылка на первую часть учебника
Если вы здесь, я предполагаю, что вы следуете руководству из предыдущей части. Мы продолжим создавать наше приложение с полным стеком, интегрируя реальный источник данных в наше приложение, которое мы будем использовать mongoDB в качестве базы данных и mongoose для создания нашей схемы для mongoDB. MongoDB - это база данных без схемы или NoSQL, поэтому мы используем mongoose для создания схемы для проверки данных, поступающих в нашу базу данных. Для начала мы должны создать папку в нашем исходном каталоге с именем models и добавьте файл с именем post.js.
const mongoose = require('mongoose') const postSchema = new mongoose.Schema({ title: { type: String, required: true, minlength: 10 }, content: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }) // using the schema to make a collection in our DB const Post = mongoose.model('Post', postSchema) module.exports = Post
Здесь нам потребовался мангуст и мы используем его для создания схемы поста, которая используется для создания коллекции в нашей базе данных, затем мы экспортируем коллекцию, чтобы к ней можно было получить доступ за пределами этого файла. Давайте создадим файл index.js в папке модели, где бы были все наши коллекции, поэтому нам нужен только файл index.js и доступ ко всем нашим коллекциям базы данных формируется там. Добавьте этот фрагмент кода в только что созданный файл index.js.
const Post = require('./post') let DB = {} DB.Post = Post module.exports = DB
Теперь перейдите в свой файл server.js и потребуйте файл index.js и добавьте следующий код, который будет использоваться для подключения к URL-адресу базы данных и использования коллекции в качестве связующего звена между вашей базой данных и graphql.
const express = require('express') const cors = require('cors') const morgan = require('morgan') const bodyParser = require('body-parser') const { graphiqlExpress, graphqlExpress} = require('apollo-server-express') const mongoose = require('mongoose') const port = 10101 const app = express() // app modules const schema = require('./graphql') const DB = require('./models') // setting up middleware for the app app.use(cors()) app.use(morgan('dev')) // setting up graphql app.use('/graphql', bodyParser.json(), graphqlExpress({ schema, context: { DB } })) // setting up a graphiql a ui for testing our query app.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql' })) // connecting to a mongodb database with name of db fullstack mongoose.connect('mongodb://localhost:27107/fullstack', () => { console.log('connected to database successfully') }) // starting the server app.listen(port, () => { console.log(`starting grapql serevr on localhost:${port}`) })
Мы обновили файл server.js, подключившись к реальной базе данных с помощью mongoose, а затем потребуем, чтобы база данных, которую мы использовали для добавления контекста в наш graphql в другом, чтобы иметь возможность доступа к данным из параметра контекста в нашем Resolver. Чтобы иметь возможность запрашивать данные с помощью graphiql, нам необходимо определить типы данных и запрос модели в вашем файле typeDefs.js.
module.exports = ` type Post { id: ID! title: String! content: String! createdAt: String! } type Query { allPost: [Post]! postById(id: ID!): Post! } type Mutation { createPost(title: String!, content: String!): Post } `
Мы обновили нашу схему typeDef и добавили мутацию под названием createPost, которая используется для изменения состояния ваших данных. Мутация createPost будет использоваться для создания нового сообщения. Прежде чем мы сможем обновить или запросить данные в нашей базе данных, давайте обновим файл resolvers.js, чтобы он соответствовал нашей текущей схеме в typeDef.js.
module.exports = { Query: { async allPost (root, args, {DB}) { const posts = await DB.Post.find() return posts }, async postById (root, args, {DB}) { const {id} = args const post = await DB.Post.findById({_id: id}) if (!post) { throw new Error('post not found ') } return post } }, Mutation: { createPost (root, args, {DB}) { const post = args const newPost = new DB.Post(post) return newPost.save() } } }
Я считаю, что все настроено хорошо, теперь, когда мы подключились к нашей базе данных и установили наш запрос и мутацию, давайте начнем тестировать API с помощью graphiql на localhost: 10101 / graphiql
Это сработало, мы только что создали пост с нашей мутацией. Давайте запросим все сообщения.
Все наши тесты работают нормально. В следующей главе руководства мы рассмотрим подключение к нашему клиенту с помощью vue.js.
Надеюсь, вы что-то поняли из этой части. Не забудьте похлопать и порекомендовать другу. Большое спасибо.