我正在学习 graphQL。有人可以帮助我理解为什么架构中没有识别突变吗?
出现此错误:
Error: "Mutations" defined in resolvers, but not in schema
Run Code Online (Sandbox Code Playgroud)
以下是代码:
架构:
const typeDefs = gql`
type Author {
age: String
name: String
books: [String]
}
type Query {
authors: [Author]
author(id: String): Author
}
type Mutation {
addAuthor(name: String, age: Int, books: [String]): Author
}
`;
const schema = makeExecutableSchema({ typeDefs, resolvers });
export default schema;
Run Code Online (Sandbox Code Playgroud)
解析器:
const resolvers = {
Query: {
authors: () => {
// return authors;
},
author: (root, { id }) => …Run Code Online (Sandbox Code Playgroud) 我在 GraphQL 模式中扩展查询时收到此错误。这是错误堆栈:
stack=[Error: Cannot extend type "Query" because it is not defined., at assertValidSDL (/NodeGraphQL/node_modules/graphql/validation/validate.js:108:11),
at Object.buildASTSchema (/NodeGraphQL/node_modules/graphql/utilities/buildASTSchema.js:71:34),
at Object.buildSchemaFromTypeDefinitions (/NodeGraphQL/node_modules/graphql-tools/dist/generate/buildSchemaFromTypeDefinitions.js:23:28),
at Object.makeExecutableSchema (/NodeGraphQL/node_modules/graphql-tools/dist/makeExecutableSchema.js:26:29),
at ApolloServer.initSchema (/NodeGraphQL/node_modules/apollo-server-core/dist/ApolloServer.js:272:49),
at new ApolloServerBase (/NodeGraphQL/node_modules/apollo-server-core/dist/ApolloServer.js:202:30),
at new ApolloServer (/NodeGraphQL/node_modules/apollo-server-express/dist/ApolloServer.js:59:9),
at Object.<anonymous> (/NodeGraphQL/dist/server.js:17:16),
at Module._compile (internal/modules/cjs/loader.js:689:30), at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10),
at Module.load (internal/modules/cjs/loader.js:599:32), at tryModuleLoad (internal/modules/cjs/loader.js:538:12),
at Function.Module._load (internal/modules/cjs/loader.js:530:3), at Function.Module.runMain (internal/modules/cjs/loader.js:742:12),
at startup (internal/bootstrap/node.js:283:19), at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)]
Run Code Online (Sandbox Code Playgroud)
我的架构如下所示:
import { gql } from 'apollo-server-express';
export const ticket = gql`
type Ticket {
id: ID! …Run Code Online (Sandbox Code Playgroud) 我有一个带有 apollo-server 的 graphql api。我使用 Graphql Playground 测试了所有查询、突变和订阅。
我正在使用 Ferry 包作为 grapqhl 客户端在 Flutter 中开发客户端应用程序。所有查询和突变都可以正常工作,但订阅却不能。
发送订阅请求时,会建立 Websocket 连接,但不会启动订阅。我在 Graphql Playground 上测试了订阅,连接请求消息如下所示
但对于渡轮客户端,它会卡在connection_init上
var link = WebSocketLink(
"ws://localhost:4000/graphql",
initialPayload: {"subscriptionParam": arg},
);
var client = Client(link: link);
client.request(request).listen((data) {//request is an object from autogenerated class from ferry
log(data.toString());//never gets here
}, onError: (error, stack) {
log("Subscription error: " + error.toString());
});
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题?请帮助!
根据阿波罗文档:
如果您的服务器使用 cookie 进行身份验证,您可以将端点配置为与https://studio.apollographql.com共享这些 cookie 。要进行此设置,您的 cookie 值必须包含
SameSite=None; Secure. 此外,这些 CORS 标头必须存在于服务器对 Studio 的响应中:Run Code Online (Sandbox Code Playgroud)Access-Control-Allow-Origin: https://studio.apollographql.com Access-Control-Allow-Credentials: true
我已经完成了那里提到的所有事情。我使用的是express,所以我使用cors中间件来设置标头:
app.use(
cors({
credentials: true,
origin: "https://studio.apollographql.com",
})
);
Run Code Online (Sandbox Code Playgroud)
但每当我在操场上打开“允许 Cookie”的开关时,状态都会变成红色(即“无法到达服务器”)。我的编辑器和nodemon没有显示错误。关闭“允许 Cookie”开关可以解决问题,但会禁用 Cookie 功能。
我该如何解决这个问题?
在解析器中,throw new createError.BadRequest("bad input")错误被劫持Graphql-shield并显示为
{
"errors": [
{
"message": "Not Authorised!",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"myMutation"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"stacktrace": [
"Error: Not Authorised!",
Run Code Online (Sandbox Code Playgroud)
这是 Apollo 服务器设置
const schema = buildSubgraphSchema([
{ typeDefs: await typeDefs(), resolvers },
]);
const apolloServer = new ApolloServer({
schema: applyMiddleware(schema, permissions),
context: async ({ req, res }) => new AuthenticatedContext(req, res)
});
Run Code Online (Sandbox Code Playgroud)
如何返回实际发生的错误?
我正在尝试从邮递员向我的节点 apollo、express 后端发出经过身份验证的请求。我收到一条错误消息,指出用户未经身份验证。当我查看上下文对象时,没有访问令牌并且调用 context.kauth.isAuthenticated() 返回 false。
查看访问令牌,我可以看到它accessToken确实是空白的,但请求标头中确实存在承载令牌。
所以我不确定为什么不包含访问令牌。
我正在向邮递员发出请求,我将令牌包含在请求中,如下所示:
为了获得此访问令牌,我首先向 Keycloak 发出邮递员请求以生成此令牌,如下所示(请注意,我故意不显示这篇文章的用户名和密码
我在上面的邮递员请求中使用了上述访问令牌。
这就是我的index.js文件的样子:
require("dotenv").config();
import { ApolloServer } from "apollo-server-express";
import { ApolloServerPluginDrainHttpServer } from "apollo-server-core";
const { makeExecutableSchema } = require('@graphql-tools/schema');
import { configureKeycloak } from "./auth/config"
import {
KeycloakContext,
KeycloakTypeDefs,
KeycloakSchemaDirectives,
} from "keycloak-connect-graphql";
import { applyDirectiveTransformers } from "./auth/transformers";
import express from "express";
import http from "http";
import typeDefs from "./graphql/typeDefs";
import resolvers from "./graphql/resolvers";
import { MongoClient } from "mongodb";
import …Run Code Online (Sandbox Code Playgroud) 在 apollo-server 3 中,我可以在创建 apollo 服务器时设置上下文,如下所示:
const server = new ApolloServer({
debug: true,
schema: executableSchema,
context: contextFunction(secretValues),
...
Run Code Online (Sandbox Code Playgroud)
我的contextFunction看起来像这样:
export const contextFunction =
(secretValues: AwsSecretValues) =>
async ({ req, res }: ExpressContext) => {
const sessionId = extractSessionIdFromCookies(req.headers.cookie);
const session = await validateSession(
sessionId || req.headers.authorization,
);
if (session) {
session.set({ expiresAt: Date.now() + DEFAULT_SESSION_EXTEND_TIME });
await session.save();
generateCookie(session._id, res);
}
return {
pubsub,
dataLoaders: dataLoaderFactory(),
session,
req,
res,
secretValues,
};
};
Run Code Online (Sandbox Code Playgroud)
它很有用,因为我不必在每个解析器上独立刷新会话,并且每个解析器都有它的最新版本,而且我还能够传递一堆其他有用的东西。
据我所知,apollo-server 4 中没有此选项。但是,如果您无法设置上下文(除了将内容深入到子解析器),那么上下文的全部意义是什么?一定有办法,但找不到办法。
第二周,我尝试在apollo-server-express / MongoDB / Mongoose / GraphQL堆栈中链接两个集合,但我不知道如何。我在REST API中找到了类似的课程,我需要的是“关系”。我需要这个,但是在GraphQL中
如何为用户添加汽车?我收集了测试服务器,代码在这里:https : //github.com/gHashTag/test-graphql-server 帮助
我有以下 MongoDB 架构。
Item {
_id: ObjectId,
translations: [{
language: String
name: String
}]
}
Run Code Online (Sandbox Code Playgroud)
所以我的 Item 实例可能看起来像这样。
{
_id: ObjectId("5ba3bf09d3121aba3ba2f488"),
translations: [
{
language: "en"
name: "a Car"
},
{
language: "de",
name: "der Wagen"
}]
}
Run Code Online (Sandbox Code Playgroud)
我希望能够通过这种方式使用 Graphql 使用特定语言查询我的数据。
{
item(where: {language: "en"}) {
name
}
}
Run Code Online (Sandbox Code Playgroud)
所以它会产生像这样形状的漂亮输出。
{
name: "a Car"
}
Run Code Online (Sandbox Code Playgroud)
请您告诉我一些好的做法或设置 Graphql 解析器映射的好方法吗?
我正在使用阿波罗服务器。
非常感谢!
我知道这已经被问了几个的时间之前,但我发现没有明确的解决方案,这是否是可能的GraphQL。我强烈认为这应该是可能的,因为它应该相对容易实现,因为 GraphQL 查询在 Apollo 中按顺序运行。
我有一种情况,我首先在客户端上执行 GraphQL 突变,然后在执行使用上一个查询结果的查询之后立即执行。这会导致等待服务器响应两个请求的响应时间过长。请求如下所示:
mutation createWebSession($authId: ID!) {
webSession: createWebSession(authId: $authId) {
token
userId
}
}
query listUserPaymentMethods($userId: ID!) {
userPaymentMethods: paymentMethods(userId: $userId) {
id
}
}
Run Code Online (Sandbox Code Playgroud)
我知道一种避免两次往返服务器的简单创可贴解决方案是创建一个新的单一 GraphQL 突变端点,该端点在后端执行这两项服务。但这似乎违背了编写模块化、可重用 GraphQL 端点的目的。因此,我很好奇是否有人知道 Apollo GraphQL 是否支持一种更简洁的方式来链接 2 个请求,其中前一个请求的结果可作为输入提供给下一个请求。
任何帮助将不胜感激,谢谢。
我想使用 express 为我已经在工作的阿波罗服务器添加订阅,但我什至无法连接到操场。我从操场上得到这个错误
"error": "Could not connect to websocket endpoint ws://localhost:4000/graphql. Please check if the endpoint url is correct."
Run Code Online (Sandbox Code Playgroud)
从 Firefox 和 chrome 我得到类似的错误
Firefox can’t establish a connection to the server at ws://localhost:4000/graphql
Run Code Online (Sandbox Code Playgroud)
这是我的 app.js 我的主文件。
const express = require('express');
const mongoose = require('mongoose');
const { ApolloServer } = require('apollo-server-express');
const cors = require('cors');
const session = require('express-session');
const Keycloak = require('keycloak-connect');
const { typeDefs } = require('./graphql/Schema');
const { resolvers } = require('./graphql/Resolvers');
const { userTypeDefs, userResolvers } …Run Code Online (Sandbox Code Playgroud) 我使用 apollo express 服务器 apollo client 3.0 创建了一个项目。我在图像上传端收到 cors 错误。我的服务器端是这样的。
注意:它加载大小为 1 kb 的图像。但是每个具有高 kb 错误的图像都会产生 cors 错误。有时上传一半的图片。
图像上传到 s3。
注 2:localhost 也可以正常工作,没有错误。
我正在使用客户端 apollo-upload-client 进行上传。客户端没有 cors 设置。
我在 url 上尝试了 cors 选项的 origin,但它仍然没有用。
const http = require("http");
const express = require("express");
require("dotenv").config();
const mongoose = require("mongoose");
const jwt = require("jsonwebtoken");
const { PubSub } = require("apollo-server");
const { ApolloServer } = require("apollo-server-express");
const { importSchema } = require("graphql-import");
const { GraphQLUpload, graphqlUploadExpress } = require("graphql-upload");
const GraphQLJSON = …Run Code Online (Sandbox Code Playgroud) apollo-server ×12
graphql ×10
apollo ×4
node.js ×4
express ×2
javascript ×2
mongodb ×2
cookies ×1
flutter ×1
keycloak ×1
mongoose ×1
react-apollo ×1
reactjs ×1
subscription ×1
typescript ×1