12 Instagramクローンコード(12)-EED
9163 ワード
符号化プログラムなしinstagramクローン符号化ショートカットhttps://nomadcoders.co/instaclone
シードを実施する前に、プロジェクトのヘッドを実施します.
ヘッドデザイン
UserActiveVarを使用してログインするかどうかを確認します
これはBackendの問題ではありません.ただし、ヘッダファイルにtokenは含まれていません.
tokenをヘッダファイルに含める必要があるのは、ログイン状態でのみ実行されるQueryまたはMutationがあるため、ヘッダファイルにtokenを入れて送信することで認証されます.
このため、apollo clientはいくつかの設定が必要です.
1.httpLink:基本バックエンドuri
2.authLink:setContextは既存のヘッダファイルにtokenを追加し、tokenをヘッダファイルとしてすべてのリクエストに送信します.
また、既存のクライアントにはuriが設定されていますが、httpLinkとauthLinkのリンクが設定されています.
TOKENを強制的に変更する場合は、必要な結果がログアウトまたは無効であることを通知します.
ただし、TOKENを強制的に変更することで、通常のログイン状態のUIが表示されます.
バックエンドから現在のログインユーザー情報を取得するmequeryを実現
meのtypeDefsはクエリであり,Userオブジェクトを返す.
meの解析器はProtectedResolverを用いて実現する.ログインしていない場合にmequeryにアクセスするとnullが返されるためです.
frontend使用me query
queryのデータはuseQueryを使用してインポートできます.
useQueryのオプションにはskipがあり、trueの場合にのみクエリ文が実行されます.
ユーザホスト実装
現在ログインユーザデータを受信するQueryは1つの場所に依存せず,多くの場所で利用できるため,このクエリはHookで実現することが望ましい.
現在のログインユーザのquery結果値をuser()で取得し、ログインユーザにavatarが存在する場合、avatar icon avatarを指定しない場合、dipolt iconを指定します.
したがって、urlが「」の場合nullが返され、urlが存在する場合、アップロードされた画像が取得されます.
Headerは、現在ログインしているユーザーのクエリー結果をユーザーを使用してデータにインポートします.
これは,データがQuery文を用いてサーバに要求された結果値であるため,受信に時間がかかるためである.すなわち、データには未定義の時点が存在するため、データが存在する.私が見つからないのでエラーが発生しました.
&&演算子 を使用 Optional Chaining 傍観者チェニンを知る前に,この問題は毎回&&演算子によって解決される.
傍観者スクリーニング(?.)なんだ.前の評価オブジェクトがnullまたはundefinedの場合、undefinedが返されるため、前の評価オブジェクトが存在しなくてもエラーは発生しません.
丹.悪用しないで無条件に存在する場所は?使用しないと、早期にエラーが見つかりやすい.
シードを実施する前に、プロジェクトのヘッドを実施します.
ヘッドデザイン
上記の設計でタイトルを整理するには、いくつかの特殊な事項しかありません.
1.ログアウト状態、すなわち登録ページ会員登録ページのタイトルX
2.ログイン時にユーザーがAvatarを使用するかどうかに基づいてProfile Iconを作成する
ログインとログアウトの確認
const isLoggedIn = useReactiveVar(isLoggedInVar);
🚫 なぜLS上のTOKENは有効で存在するがnullを返すのか
これはBackendの問題ではありません.ただし、ヘッダファイルにtokenは含まれていません.
tokenをヘッダファイルに含める必要があるのは、ログイン状態でのみ実行されるQueryまたはMutationがあるため、ヘッダファイルにtokenを入れて送信することで認証されます.
解決策
このため、apollo clientはいくつかの設定が必要です.
1.httpLink:基本バックエンドuri
2.authLink:setContextは既存のヘッダファイルにtokenを追加し、tokenをヘッダファイルとしてすべてのリクエストに送信します.
また、既存のクライアントにはuriが設定されていますが、httpLinkとauthLinkのリンクが設定されています.
// apollo.js
const httpLink = createHttpLink({
uri:"http://localhost:4000/graphql",
});
const authLink = setContext((_,{headers})=>{
return {
headers:{
...headers,
token:localStorage.getItem(TOKEN),
},
};
});
export const client = new ApolloClient({
cache:new InMemoryCache(),
link:authLink.concat(httpLink),
});
🚫 LSのTOKENを強制的に変更したら?
TOKENを強制的に変更する場合は、必要な結果がログアウトまたは無効であることを通知します.
ただし、TOKENを強制的に変更することで、通常のログイン状態のUIが表示されます.
解決策
バックエンドから現在のログインユーザー情報を取得するmequeryを実現
meのtypeDefsはクエリであり,Userオブジェクトを返す.
meの解析器はProtectedResolverを用いて実現する.ログインしていない場合にmequeryにアクセスするとnullが返されるためです.
frontend使用me query
queryのデータはuseQueryを使用してインポートできます.
useQueryのオプションにはskipがあり、trueの場合にのみクエリ文が実行されます.
// useUser.js
// 여기서 hasToken은 isLoggedInVar의 Boolean값이다.
const {data} = useQuery(ME_QUERY,{
skip:!hasToken,
});
インポートしたデータがバックエンド設計でログインされている場合、tokenが存在し、このtokenを持つユーザーが存在する場合、そのユーザーのデータが返されます.ログインしていない場合、tokenが存在しないか、tokenが存在しないが一致しないユーザーがnullが返されます.ユーザホスト実装
現在ログインユーザデータを受信するQueryは1つの場所に依存せず,多くの場所で利用できるため,このクエリはHookで実現することが望ましい.
// useUser.js
function useUser(){
// data가 변경되는 경우마다 실행
useEffect(()=>{
if(data?.me ===null){
logUserOut(history);// LS의 토큰을 삭제하고 home route로 이동(로그인페이지로 이동)
}
},[data]);
return data;
}
export default useUser;
ログインなしでHeader Avatarを使用
現在のログインユーザのquery結果値をuser()で取得し、ログインユーザにavatarが存在する場合、avatar icon avatarを指定しない場合、dipolt iconを指定します.
Avatar Component
const Avatar = ({url=""})=>{
return <SAvatar>{url !== ""? <Img src={url}/> : null}</SAvatar>
}
Avatarコンポーネントはurlをpropsとして使用し、転送できない場合はdepartに「」を渡します.したがって、urlが「」の場合nullが返され、urlが存在する場合、アップロードされた画像が取得されます.
🚫 Reactの実装でよくあるエラー
Headerは、現在ログインしているユーザーのクエリー結果をユーザーを使用してデータにインポートします.
data.me.avatar
に示すように、エラーが発生します.これは,データがQuery文を用いてサーバに要求された結果値であるため,受信に時間がかかるためである.すなわち、データには未定義の時点が存在するため、データが存在する.私が見つからないのでエラーが発生しました.
解決策
傍観者スクリーニング(?.)なんだ.前の評価オブジェクトがnullまたはundefinedの場合、undefinedが返されるため、前の評価オブジェクトが存在しなくてもエラーは発生しません.
丹.悪用しないで無条件に存在する場所は?使用しないと、早期にエラーが見つかりやすい.
Reference
この問題について(12 Instagramクローンコード(12)-EED), 我々は、より多くの情報をここで見つけました https://velog.io/@kamoo2/TIL-12-인스타그램-클론코딩-12-FEEDテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol