我将前端连接到 graphql 服务器。大多数(如果不是所有)突变都受到保护,而所有查询都不受保护。我有一个身份验证系统,如果您登录,您将获得一个访问/刷新令牌,所有突变都需要使用该令牌。他们做得很好,后端接收标题和一切!
然而。有一个查询至少需要访问令牌来区分当前用户!但是后端没有收到这两个标头!我认为我创建的 middlewareLink 将适用于所有查询/突变,但我错了,找不到任何额外的资源来帮助我。
所以这是我的设置
阿波罗客户端.js
import { InMemoryCache } from "apollo-cache-inmemory"
import { persistCache } from "apollo-cache-persist"
import { ApolloLink } from "apollo-link"
import { HttpLink } from "apollo-link-http"
import { onError } from "apollo-link-error"
import { setContext } from "apollo-link-context"
if (process.browser) {
try {
persistCache({
cache,
storage: window.localStorage
})
} catch (error) {
console.error("Error restoring Apollo cache", error)
}
}
const httpLink = new HttpLink({
uri: process.env.GRAPHQL_URL || "http://localhost:4000/graphql"
})
const authMiddlewareLink = setContext(() => ({
headers: {
authorization: localStorage.getItem("apollo-token") || null,
"x-refresh-token": localStorage.getItem("refresh-token") || null
}
}))
const afterwareLink = new ApolloLink((operation, forward) =>
forward(operation).map(response => {
const context = operation.getContext()
const {
response: { headers }
} = context
if (headers) {
const token = headers.get("authorization")
const refreshToken = headers.get("x-refresh-token")
if (token) {
localStorage.setItem("apollo-token", token)
}
if (refreshToken) {
localStorage.setItem("refresh-token", refreshToken)
}
}
return response
})
)
const errorLink = onError(({ graphQLErrors, networkError }) => {
...
// really long error link code
...
})
let links = [errorLink, afterwareLink, httpLink]
if (process.browser) {
links = [errorLink, afterwareLink, authMiddlewareLink, httpLink]
}
const link = ApolloLink.from(links)
export default function() {
return {
cache,
defaultHttpLink: false,
link
}
}
有没有办法使用自定义标头来定位所有突变/查询而不仅仅是突变?或者将一些标头应用于单个查询,因为我可能会将其作为应用程序中间件?
编辑:还没有解决这个SSR部分..一旦我有答案,我会重新编辑。