我正在使用Apollo Stack graphql-server-express和apollo-client.
因为我的后端不完美,所以可能会出现错误,因此我必须对该路径的错误请求做出响应.
直到现在我的主要问题是身份验证,因此我回复了一个错误.
return new Error(`${data.status}: ${data.statusText} @ ${data.url}`)
Run Code Online (Sandbox Code Playgroud)
在前端,我使用apollo-client查询数据.
return apollo
.query({query: gql`
query {
${query}
}`,
forceFetch: forceFetch
})
.then(result => { debugger; return result.data })
.catch(error => { debugger; console.error(error); });
Run Code Online (Sandbox Code Playgroud)
但是,如果查询的一个属性响应错误,则只调用catch函数.即使是剩余属性的数据也会被转移,我在Chrome开发工具的网络标签中看到了这一点.In不是catch函数中的错误对象.
我的尝试与GraphiQL一起使用,我在同一个对象中获取错误和数据.
那么如何在不丢失整个请求的情况下为属性抛出错误呢?
我试图在基于Apollo的graphql server (2.0)中为基于JWT的身份验证找出这种情况.
基本上在登录后,用户从服务器获取accessToken和refreshToken.
AccessToken在一段时间后过期,服务器发送一条错误消息,表明令牌已过期(TokenExpiredError),然后客户端需要通过传递refreshToken与服务器进行新的accessToken通信.
流量如下 -
我已经在客户端实现了refreshToken变异但是无法弄清楚何时发生错误停止所有请求 - >请求新令牌 - >再次进行所有待处理请求以及刷新令牌是否已过期注销用户.
有人可以帮我这个,我的设置如下,在Apollo 2.0之前,我有一个server.js,其中我使用了express和graphql-server-express我有一个只有http的cookie会话,当用户登录时我设置了jwt令牌作为cookie,它在浏览器中设置为仅限http.在后续请求中,我验证浏览器传回的cookie.一切正常,我可以从任何其他解析器中的req.session.token访问令牌,并验证保存在cookie会话中的jwt令牌.
server.js
import express from 'express';
import { graphqlExpress, graphiqlExpress } from 'graphql-server-express';
import { ApolloEngine } from 'apollo-engine';
import bodyParser from 'body-parser';
import cors from 'cors';
import cookieSession from 'cookie-session';
import schema from './schema/';
?
const server = express();
?
server.use(
cookieSession({
name: 'session',
keys: 'k1,k2',
maxAge: 30 * 60 * 1000,
domain: '.mydomain.com',
path: '/',
}),
);
?
const corsOptions = {
origin: 'http://local.mydomain.com:3000',
credentials: true,
methods: ['GET', 'PUT', 'POST', 'OPTIONS'],
};
?
server.use(cors(corsOptions));
?
server.use(
'/graphql', …Run Code Online (Sandbox Code Playgroud) 我是 GraphQL 的新手。我正在遵循 Internet 上的几个指南,以“创建”一个使用 Apollo Server + Express + GraphQL + MongoDB 的小应用程序。
编译时我从 GraphQL 得到:
错误:只能有一种名为“用户”的类型。
错误:只能有一种名为“查询”的类型。
我的代码结构如下:
到目前为止,我的代码如下所示:
typeDefs/user.js:
import { gql } from 'apollo-server-express';
const user = gql`
type User {
id: ID!
name: String
email: String
password: String
}
type Query {
getUsers: [User]
}
type Mutation {
addUser(name: String!, email: String!, …Run Code Online (Sandbox Code Playgroud) 使用 apollo-server-lambda 在 lambda 无服务器中设置 cookie
我正在从 apollo-server 迁移到无服务器版本。有没有办法可以访问响应对象或其他方式来设置 cookie?
context: ({ event, context }) => ({
headers: event.headers,
functionName: context.functionName,
event,
context,
}),
Run Code Online (Sandbox Code Playgroud)
我期望在上下文中可以像在 apollo-server 中一样访问 res 对象。
I've got an ApolloServer project that's giving me trouble, so I thought I might update it and ran into issues when using the latest Babel. My "index.js" is:
require('dotenv').config()
import {startServer} from './server'
startServer()
Run Code Online (Sandbox Code Playgroud)
And when I run it I get the error "SyntaxError: Cannot use import statement outside a module". First I tried doing things to convince TPTB* that this was a module (with no success). So I changed the "import" to a "require" and this worked.
But now …
我正在使用 Jest 测试 Apollo 服务器RESTDataSource。我的应用程序是用 TypeScript 编写的。我的类CDCDataSource扩展了抽象类RESTDataSource,它本身扩展了抽象类DataSource。 具有允许您从外部 REST 数据源提取数据的RESTDataSource方法。get我希望模拟这个方法,因为我希望模拟外部数据源。
protected async get<TResult = any>(
path: string,
params?: URLSearchParamsInit,
init?: RequestInit,
): Promise<TResult> {
return this.fetch<TResult>(
Object.assign({ method: 'GET', path, params }, init),
);
}
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试使用 Jest 来模拟这个方法时spyOn——遵循这里的第二个答案:Jest:如何模拟类的一个特定方法——
import CDCDataSource from '../CDCDataSource';
test('Test', () => {
let dataSource = new CDCDataSource();
let spy = jest.spyOn(dataSource, 'get').mockImplementation(() => 'Hello');
expect(dataSource.get()).toBe('Hello');
Run Code Online (Sandbox Code Playgroud)
但是,我收到 TypeScript 错误
TS2768:没有重载与此调用匹配
越过 …
我在尝试检查 apollo graphql 是否正常工作时收到此错误。错误:您必须await server.start()在调用之前server.createHandler()
注意:有一个类似的问题,但我没有使用express错误:您必须在调用`server.applyMiddleware()`之前`await server.start()`
//api/graphql.js
import { ApolloServer } from "apollo-server-micro";
import { resolvers } from "../../apis/resolver";
import { typeDefs } from "../../apis/schemas";
const apolloServer = new ApolloServer({ typeDefs, resolvers });
export const config = {
api: {
bodyParser: false
}
};
export default apolloServer.createHandler({ path: "/api/graphql" });
Run Code Online (Sandbox Code Playgroud)
//解析器
import axios from "axios";
export const resolvers = {
Query: {
getUsers: async () => {
try {
const users = await axios.get("https://api.github.com/users");
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的基本 apollo 服务器部署到 aws ec2 实例,但我面临着
“无法访问服务器 从 Studio 通过 HTTPS 向您的 HTTP 端点发出的网络请求不安全,因此我们无法内省您的端点。”
所以我该怎么做 ?
是否可以从apollo-server-express应用程序上的GraphQL端点在浏览器中触发文件下载?
我有一个标准快速app.get函数编写的端点(见下文),但我想利用GraphQL上下文进行文件下载,所以我想知道是否有可能从GraphQL端点下载.
这是我在app.get函数快速结束时所拥有的一个简单示例:
app.get('/download-batch/:batchId', async (req, res) => {
res.send(new Buffer('test'));
});
Run Code Online (Sandbox Code Playgroud)
任何帮助我都非常感激.谢谢!
apollo-server ×10
graphql ×8
node.js ×4
apollo ×3
javascript ×3
amazon-ec2 ×1
apollostack ×1
babeljs ×1
express ×1
jestjs ×1
jwt ×1
lambda ×1
next.js ×1
serverless ×1
typescript ×1
unit-testing ×1