使用@vimeo/vimeo库获取视频详情时提示视频不存在的问题排查
排查Vimeo API返回"The requested video couldn't be found"的问题
针对你在Next.js getStaticProps中调用Vimeo API获取自有库视频详情失败的问题,从以下几个方向排查:
1. 检查Access Token的权限范围
你验证过token能访问/tutorial接口,但该接口仅需基础权限,而访问私有视频需要额外权限范围。确认你的token生成时包含以下至少一个scope:
private:允许访问账号下的私有内容video.read:允许读取视频详细信息
可调用https://api.vimeo.com/me接口查看当前token的权限,返回的scope字段会列出所有授权范围。如果缺少必要权限,需重新生成带有对应scope的access token。
2. 确认视频的隐私设置
即使视频在你的库中,若隐私设置为**"仅自己可见"或"密码保护"**,需确保token权限足够访问这类视频。自有账号的token只要具备private权限,即可访问"仅自己可见"的视频,无需额外携带密码参数。
3. 修正API请求路径(针对文件夹/项目中的视频)
如果视频嵌套在Project(文件夹)中,不要直接拼接文件夹名称到视频ID后:
- 先调用
https://api.vimeo.com/me/videos,查看返回列表中是否包含目标视频ID,确认视频在账号可访问范围内。 - 若要通过Project获取视频,路径应为
/projects/{project_id}/videos/{video_id},其中project_id是文件夹的数字ID,不是名称。
4. 修正getStaticProps中的异步处理逻辑
你使用@vimeo/vimeo库的代码中,client.request是回调式的,而getStaticProps是async函数,会导致函数提前返回,无法正确捕获请求结果。建议将回调转为Promise:
import { Vimeo } from '@vimeo/vimeo'; import { promisify } from 'util'; export async function getStaticProps() { const client = new Vimeo(`${clientId}`, `${clientSecret}`, `${accessToken}`); // 将回调方法转为Promise const request = promisify(client.request.bind(client)); try { const body = await request({ method: 'GET', path: `/videos/796808098`, }); return { props: { videoData: body }, }; } catch (error) { console.error('Vimeo API请求失败:', error); return { props: { videoData: null }, }; } }
fetch请求也需要在getStaticProps中正确使用await:
export async function getStaticProps() { try { const res = await fetch('https://api.vimeo.com/videos/796808098', { headers: { Authorization: `bearer ${accessToken}`, 'content-type': 'application/json', }, }); if (!res.ok) { throw new Error(`HTTP错误状态: ${res.status}`); } const json = await res.json(); return { props: { videoData: json }, }; } catch (error) { console.error('请求失败:', error); return { props: { videoData: null }, }; } }
5. 确认视频ID的正确性
再次核对视频ID是否为纯数字格式,确保没有复制错误或携带额外字符。
内容的提问来源于stack exchange,提问作者user21414410
相关产品推荐
相关产品推荐

