Не получено никакого ввода от разработчиков graphql-yoga , поэтому его спросили на prisma slack и посоветовали использовать apollo-server-express вместо этого.
Основные изменения, которые я заметил при переходе на ApolloServer:
- Он передает
{ req, res }
вместо { request, response }
- Вам необходимо импортировать схему с graphql-import ex:
typeDefs: importSchema('./src/schema.graphql')
Сначала я создаю экспресс-приложение и httpServer для socket-io и приказываю io прослушивать httpServer, созданный с помощью app :
const app = express();
const httpServer = require('http').createServer(app);
const io = require('socket.io')(httpServer);
require('./socket')(io); // my io.on('connection', socket => {}) function taking io as param
io.listen(httpServer);
Затем я применяю все промежуточное ПО и устанавливаю маршруты с приложением :
if (process.env.NODE_ENV === 'production') {
app.use(express.static(path.join(__dirname, '../../client/build')));
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname, '../../client/build', 'index.html'));
});
} else {
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, '../../client/public', 'index.html'));
});
}
app.use(cookieParser());
app.use((req, res, next) => {
if (!req.cookies || !req.cookies.token) {
return next();
}
const { token } = req.cookies;
if (token) {
console.log(process.env.PORT);
const { userId } = jwt.verify(token, process.env.JWT_SECRET);
// Put the userId onto the req for future requests to access
req.userId = userId;
}
next();
});
Наконец (с использованием ApolloServer 2) я применяю приложение в качестве промежуточного программного обеспечения для ApolloServer и приказываю httpServer прослушивать :
import server from './server' // my ApolloServer
server.applyMiddleware({
app,
path: '/graphql',
cors: {
credentials: true,
origin: process.env.DOMAIN_FULL + ':' + process.env.PORT || '3000'
}
});
httpServer.listen({
port: process.env.PORT || 4000
},
() => console.log(`Server is running on ${server.graphqlPath}`)
);
Убедитесь, что с клиентом, который вы создаете, используется io () без параметров, и ваш ApriloClient URI равен '/graphql'