我和我的团队正在研究 Laravel API,它与 Vue.js 前端通信,前端使用 Apollo 客户端来使用 GraphQL 响应。
我们遇到了将缓存控制标头添加到响应中的问题。
Apollo 无法缓存内容,因为响应包含以下标头:
Cache-Control: no-cache, private
Run Code Online (Sandbox Code Playgroud)
在 php.ini 中,我们可以禁用 PHP 发送缓存控制标头:
; Set to {nocache,private,public,} to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.
; http://php.net/session.cache-limiter
session.cache_limiter =
Run Code Online (Sandbox Code Playgroud)
在 nginx 配置中,我们找不到任何设置这些标头的内容。我检查了我们在站点/可用中设置的全局 nginx.conf 和配置文件。
我可以将其添加到 nginx 配置中,但它只会添加另一个标头:
add_header Cache-Control "public";
Cache-Control: no-cache, private
Cache-Control: public
Run Code Online (Sandbox Code Playgroud)
如果此标头不是来自 PHP 或 nginx,那么它可能来自哪里?我该如何删除或覆盖它?
我发现了一篇很棒的文章,将身份验证添加到 react 中。文章:https : //www.robinwieruch.de/complete-firebase-authentication-react-tutorial/
本文使用一个 HOC 组件完成了 firebase 设置(在 redux 之前),我可以将其放入应用程序并可以通过上下文访问。
我的问题是如何将它放入应用程序组件之外的 apollo 客户端,因此即使有上下文我也无法设置它。我对 redux 也有同样的问题。我发现只有一个是使用本地存储,但我想避免这种情况。
这是主应用程序组件中我的 apollo 客户端。
const client = new ApolloClient({
uri: clientUrl,
request: async operation => {
const token = How_do_i_set_this <-- ???
console.log('token in request', token)
operation.setContext({
headers: {
authorization: token ? `Bearer ${token}` : ''
}
});
}
});
const App = () => (
<DashAppHolder>
<ApolloProvider client={client}>
<Provider store={store}>
<PublicRoutes history={history} />
</Provider>
</ApolloProvider>
</DashAppHolder>
);
Run Code Online (Sandbox Code Playgroud) 我不确定我在这里做错了什么?我现在在无服务器设置中让我的突变与我的 apollo-server-lambda 一起运行已经有一段时间了,当我尝试运行这样的查询时,我的查询工作正常:
{ "mutation": "{ signIn(username: \"SomeUser\", password: \"SomePassword\" ) { token } }" }
Run Code Online (Sandbox Code Playgroud)
我刚收到消息:“必须提供查询字符串。” 状态 400。
我已经像这样设置了我的解析器:
const resolvers = {
Query: {
users: async (_, args, ctx) => User.load(args, ctx)
},
Mutation: {
signIn: async (_, { username, password }, ctx) => Auth.signIn({ username, password }, ctx)
}
};
Run Code Online (Sandbox Code Playgroud)
对于额外的信息,这里是我的 typeDefs:
const typeDefs = gql`
type User {
id: ID!,
firstname: String,
lastname: String,
username: String,
createdAt: String,
role: String
}
type AuthToken {
token: String …Run Code Online (Sandbox Code Playgroud) 在 Apollo 服务器中,当客户端用户订阅订阅(使用 WebSocket)时,我们可以使用订阅解析器检测到这一点。
但是有没有办法检测取消订阅?我看到 WebSocket 发送了一条{"id": "1", "type": "stop"}消息,但我不知道如何捕捉它
所以我不想知道用户何时从 Websocket 断开连接,而是用户何时取消订阅 Apollo 客户端的订阅。
我正在使用 react-native 和 apollo 客户端,如果我尝试通过存储在 AsyncStorage 中的 jwt 设置标头,它似乎不起作用。
其他不需要标题的解析器工作得很好。我的代码如下。
import { ApolloClient } from "apollo-client";
import { InMemoryCache } from "apollo-cache-inmemory";
import { ApolloLink } from "apollo-link";
import { createHttpLink } from "apollo-link-http";
import AsyncStorage from "@react-native-community/async-storage";
const cache = new InMemoryCache();
const getToken = async () => {
const token = await AsyncStorage.getItem("jwt");
if (token) {
return token;
} else {
return null;
}
};
const httpLink = new createHttpLink({
uri: ""
});
const authLink = new ApolloLink((operation, …Run Code Online (Sandbox Code Playgroud) Apollo 服务器似乎没有附带任何类型的日志记录。这使得它很难按原样在生产环境中使用 - 它实际上是盲目的。有没有推荐的方法来启用不同类型的日志?
我特别关注查看详细日志、错误日志(当服务器崩溃/内部组件崩溃时)和其他调试日志。
更新:我已经winston用于记录基本事件。这个问题与详细的日志记录有关——比如记录请求生命周期的各个部分、服务器崩溃、缓存错误等。
我使用gql来自graphql-tag。假设我有一个这样gql定义的对象:
const QUERY_ACCOUNT_INFO = gql`
query AccountInfo {
viewer {
lastname
firstname
email
phone
id
}
}
`
Run Code Online (Sandbox Code Playgroud)
必须有办法摆脱AccountInfo它。我该怎么做?
我正在使用 Angular 和 Ionic 开发一个应用程序。作为后端,我有一个运行 ApolloServer 和 Neo4j(使用grandstarter.io)的节点服务器。在客户端,我目前有一个名为 queries.ts 的文件,我在其中定义了我的 graphql 查询,如下所示:
supplierByName = (value) => {
const query = gql`
{
Supplier(filter: {name: "${value}"}) {
name
}
}
`;
return query;
};
Run Code Online (Sandbox Code Playgroud)
我正在使用 apollo 所以我这样做是为了运行我的 graphql 查询
this.apollo.query({
query: this.queries.supplierByName(supplierName)
})
.subscribe(....)
Run Code Online (Sandbox Code Playgroud)
现在,由于不喜欢将我的 graphql 查询作为字符串,我希望将我的查询直接放在 .graphql 文件中。直接在 graphql 文件中工作时更好的工具,老实说,这主要是因为查询现在伤害了我的眼睛:)
我想要这样(文件:querys.graphql):
query supplierByName($value: String) {
Supplier(filter: { name: "$value}" }) {
name
}
}
Run Code Online (Sandbox Code Playgroud)
然后当我用 Apollo 执行 graphql 查询时,我想做这样的事情:
import supplierByName from './queries.graphql'
.....
this.apollo.query({
query: supplierByName(supplierName)
})
.subscribe(....)
Run Code Online (Sandbox Code Playgroud)
并以某种简单的方式将其与 …
所以看看文档中的 Apollo useMutation 示例https://www.apollographql.com/docs/react/data/mutations/#tracking-loading-and-error-states
function Todos() {
...
const [
updateTodo,
{ loading: mutationLoading, error: mutationError },
] = useMutation(UPDATE_TODO);
...
return data.todos.map(({ id, type }) => {
let input;
return (
<div key={id}>
<p>{type}</p>
<form
onSubmit={e => {
e.preventDefault();
updateTodo({ variables: { id, type: input.value } });
input.value = '';
}}
>
<input
ref={node => {
input = node;
}}
/>
<button type="submit">Update Todo</button>
</form>
{mutationLoading && <p>Loading...</p>}
{mutationError && <p>Error :( Please try again</p>}
</div>
);
}); …Run Code Online (Sandbox Code Playgroud) 我有循环 - forEach - 为数组的每个元素找到 productId 。我想使用 apollo 查询通过 productId 获取我的数据库。怎么做?
products.forEach(({ productId, quantity }) =>
// fetch by 'productId'
);
Run Code Online (Sandbox Code Playgroud) apollo ×10
graphql ×7
javascript ×3
reactjs ×2
angular ×1
async-await ×1
asyncstorage ×1
firebase ×1
graphql-tag ×1
hook ×1
laravel ×1
nginx ×1
node.js ×1
php ×1
react-native ×1
serverless ×1
typescript ×1