我正在使用在客户端使用React和Redux的Laravel应用程序,使用React预设和Mix。我决定尝试使用GraphQL来代替API,而不是通常的REST API方法,到目前为止它的工作正常。但是,我现在卡住了。
我正在使用Apollo作为我的HTTP客户端,因为它是为使用GraphQL而构建的。在过去,我使用JWT Auth来保护API,所以我自然也采用了这种方法,因为实现只是添加一个合适的标头。我跟着the instruction on setting headers with Apollo,但标题没有设置。这是有问题的JS文件:
import LinkList from './components/LinkList';
import React from 'react';
import ReactDOM from 'react-dom';
import {Container} from './container';
import {createStore} from 'redux';
import reducer from './reducer';
import {Provider} from 'react-redux';
import {fromJS} from 'immutable';
import ApolloClient from 'apollo-boost';
import gql from 'graphql-tag';
import { createHttpLink } from 'apollo-link-http';
import { setContext } from 'apollo-link-context';
import { InMemoryCache } from 'apollo-cache-inmemory';
const httpLink = createHttpLink({
uri: window.initialData.graphql_route
});
const authLink = setContext((_, { headers }) => {
const token = window.initialData.jwt;
// return the headers to the context so httpLink can read them
return {
headers: {
...headers,
authorization: token ? `Bearer ${token}` : "",
}
}
});
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache()
});
client.query({
query: gql`{
links {
id
title
link
}}`
}).then(result => console.log(result));
const store = createStore(
reducer,
fromJS(window.initialData),
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
if (document.getElementById('list')) {
ReactDOM.render(
<Provider store={store}>
<Container />
</Provider>,
document.getElementById('list')
);
}
我在视图中填充window.initialData
,其中包含必要的数据,包括JWT标记window.initialData.jwt
。在authLink
定义中设置断点不会做什么,这意味着它永远不会被调用。
知道出了什么问题吗?我已经非常仔细地遵循了文档中的示例,所以我能想到的是它们可能会被约会。
答案 0 :(得分:8)
您正在使用来自&#39; apollo-boost&#39;的ApolloClient,但您的令牌配置适用于另一个ApolloClient,来自&#39; apollo-client&#39的{ApolloClient}。
如果你想使用apollo-boost中的ApolloClient保存令牌:
$result = Bookings::where('start_date', '<=' $request->start_date)->where('end_date', '>=' $request->end_date)->where('room_id',$request->room_id)->first();
if(!$result){
// Code to Book room
}