react-native - [GraphQL 错误]:使用 React 和 Apollo 登录期间创建上下文失败
问题描述
最初我的身份验证工作正常。然后我打开计算机并再次返回代码,这一次,我的身份验证失败并显示以下消息
[GraphQL 错误]:消息:上下文创建失败:您的会话已结束。请重新登录,位置:未定义,路径:未定义
我已经为令牌设置了一个到期日。我尝试在登录前清除缓存,但仍然出现上述错误。
下面是我的登录功能代码
_handleSubmit = (values, bag, signIn) => {
signIn({
variables: {
email: values.email,
password: values.password
}
})
.then(async ({ data }) => {
if (data && data.signIn.token) {
await AsyncStorage.setItem("token", data.signIn.token);
this.props.navigation.navigate("Main");
}
})
.catch(err => {
bag.setSubmitting(false);
bag.setErrors(err);
});
};
我的堆栈是 apollo、mongodb、react-native。我怀疑问题可能出在缓存上。我试图清除缓存,但通过按“R”清除了 Expo 上的缓存,但我仍然无法登录。
[更新] 错误是由于 jwt 令牌已过期。当我在 getUser 函数中使用 console.log(@res, res) 时出现此错误
{ TokenExpiredError: jwt 过期...
有趣的是,我为每个登录创建了一个新的 jwt 令牌。下面是我的 createToken 和 getUser 代码
以前有人遇到过这种情况吗?你如何解决它?
const createToken = (user, expiresIn) => {
const { _id, email } = user;
//creturn jwt.sign({ _id, email }, process.env.SECRET_KEY, { expiresIn });
return jwt.sign({ _id, email }, process.env.SECRET_KEY);
};
const getUser = async token => {
if (token) {
try {
const res = await jwt.verify(token, process.env.SECRET_KEY);
console.log("@res ", res);
return res;
} catch (error) {
console.log("@error ", error);
throw new AuthenticationError(
"Your session has ended. Please sign in again"
);
}
}
};
谢谢
解决方案
我在我的 ApolloClient 的 authLink 中运行...
await AsyncStorage.removeItem("token");
然后将其注释掉,它再次起作用了!
const authLink = setContext(async (req, { headers }) => {
// await AsyncStorage.removeItem("token");
const token = await AsyncStorage.getItem("token");
console.log("@token ", token);
return {
headers: {
...headers,
authorization: token ? `${token}` : ""
}
};
});
推荐阅读
- alloy - 了解合金中的约束
- r - 在模块中使用 R Shiny 应用程序下载 powerpoint
- internet-explorer-11 - 一段时间后显示“此内容无法在框架中显示”
- numpy - 使用查找表进行快速图像处理
- css - 如何减小图像背景的大小或将其删除
- batch-file - 将服务的启动类型更改为 Oracle 的批处理脚本
- google-bigquery - 在 AutoML 批量预测结果中指定 BigQuery 数据集/表的名称
- c# - 使用系统反射从类属性中查找所有类型的列表
- javascript - 对函数数组进行与运算
- html - 首先垂直对齐 div 元素,然后在下一列中水平对齐