Получение доступа пользовательского агента в резольвере в graphql - PullRequest
0 голосов
/ 28 июня 2018

Я относительный новичок в GraphQL, но это меня раздражает. Я хочу получить пользовательский агент из тела запроса, отправляемого со стороны клиента. Я могу получить доступ к пользовательскому агенту в промежуточном программном обеспечении, однако, когда я вызываю следующую функцию с любым параметром для отправки в распознаватель, я не получаю никаких данных от него. Если я не передаю какие-либо параметры в next (), распознаватель работает, как ожидается, однако parent, args, User и Session не содержат никакой информации о заголовках запроса. Любая помощь или общие советы будут с благодарностью! Спасибо!

app.js

import express from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import { graphiqlExpress, graphqlExpress } from 'apollo-server-express';
import { makeExecutableSchema } from 'graphql-tools';

import typeDefs from './Graphql/typeDefs';
import resolvers from './Graphql/resolver';

import { User } from './Mongoose/Schemas/user';
import { Session } from './Mongoose/Schemas/session';

mongoose.connect('mongodb://localhost/test');

const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
});

const helperMiddleware = [
  bodyParser.json(),
  bodyParser.text({ type: 'application/graphql' }),
  (req, res, next) => {
    if ( req.body ) {
      console.log(req.headers['user-agent']);
    }
    next();
  },
];

const PORT = 3009;

const app = express();

app.use('/graphql', ...helperMiddleware, graphqlExpress({ schema, context: { User, Session } }));

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

app.listen(PORT);

console.log(`Running On Port ${PORT}`);

resolver.js

  Mutation: {
    createUser: async (parent, args, { User, Session }) => {

      const user = await new User(args).save();
      user._id = user._id.toString();

      const session = await new Session({
        user_id: user._id,
        userAgent: 'Nothing ATM',
        ip: 'Nothing ATM',
      }).save();

      return user;
    },

1 Ответ

0 голосов
/ 28 июня 2018

Вам нужно использовать версию обратного вызова для создания промежуточного программного обеспечения сервера GraphQL, иначе у вас нет возможности построить контекст на основе текущего запроса:

https://www.apollographql.com/docs/apollo-server/setup.html#options-function

...