2025年2月19日面试
2025/02/19·面试·面试, 无感刷新·11 次浏览
面试查漏补缺,每一次面试都是一次进步。 这样看来,也许进公司的不是全能型人才,更可能是面试经验丰富的人,会的咱就不提了,专挑硬骨头啃
1.使用js获取父元素的第5个子元素
咋一听这么简单!但是偏偏脑子不好使啊,学过的东西忘得一干二净,谁让不用呢 “快点想啊,脑瓜子”,先获取所有子元素,再找第五个,写出来就是
const parentElement = document.getElementById('parent'); // 假设父元素的 id 是 'parent'
const fifthChild = parentElement.children[4]; // 获取第五个子元素(索引从 0 开始)
回答之后可能不是面试官想要的答案,说要结合选择器,脑瓜子再一转
const fifthChild = document.querySelector('#parent > :nth-child(5)');
嘻嘻嘻~
2.无感刷新(长短token问题)
通过两个token(一个时间短容易过期的token,一个长时间才会过期的token,一般放在HTTPOnly的cookie中,不能通过js来直接访问),来提升token的安全性和减少服务器压力
目的就是通过长token在短token过期的时候换取新的短token,难点在于短token过期后如果重新触发原来的请求并把数据给到调用的函数或者页面,上代码:
api.interceptors.response.use(
response => response, // 如果响应成功,直接返回
async error => {
const originalRequest = error.config;
// 如果是 401 错误并且没有重试过
if (error.response?.status === 401 && !originalRequest._retry) {
if (isRefreshing) {
// 如果正在刷新 token,则等待刷新完成后再执行请求
return new Promise(resolve => {
failedRequestsQueue.push(newToken => {
originalRequest.headers.Authorization = `Bearer ${newToken}`;
resolve(api(originalRequest));
});
});
}
originalRequest._retry = true; // 标记为已重试
try {
const newToken = await refreshTokenAndRetryRequests();
originalRequest.headers.Authorization = `Bearer ${newToken}`;
return api(originalRequest); // 重新发送请求
} catch (refreshError) {
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
);
主要看这行
return api(originalRequest); // 重新发送请求
可以重新发送之前失败的请求
完整代码放在仓库,使用axios进行请求封住,使用nextjs编写,包含api和页面可进行测试
在短token过期时立即使用长token换取短token并重新发送之前的请求
还有两个问题稍后在写,一个是关于无感上线,另一个是关于测量文字边界