Discord.js v14机器人中Lavalink搜索请求始终返回loadType: error
问题场景
运行Discord.js v14机器人搭配Poru和自托管Lavalink节点时,调用播放/搜索命令会出现以下情况:
[Play Command] Search initiated: "travis scott fe!n"
[Play Command] Search result retrieved. Load type: error
[Play Command] Search failed or no result. The full response returned: Response {
tracks: [],
loadType: 'error',
playlistInfo: { type: 'noPlaylist' }
}
所有搜索查询均触发该问题,且Lavalink日志、机器人错误处理器无明显异常。已完成以下验证:
- Lavalink可通过配置的主机、端口、密码正常访问
application.yml中已启用sources.youtube选项- Poru节点设置与Lavalink端点完全匹配
- Java 24与当前Lavalink版本兼容
排查与解决步骤
1. 完善Lavalink YouTube源配置
仅启用sources.youtube可能不足,需确认application.yml中YouTube相关配置细节:
sources: youtube: true youtube: enabled: true musicEnabled: true # 若需YouTube Music搜索,需开启此项 # 关键:添加YouTube Data API密钥(无密钥易被YouTube限制搜索) apiKey: "你的YouTube Data API密钥"
没有API密钥会导致YouTube搜索请求被限流或拒绝,最终返回error负载。
2. 直接测试Lavalink节点搜索能力
绕过Poru和Discord.js,用curl直接向Lavalink发送搜索请求,定位问题环节:
curl -X POST "http://你的Lavalink主机:端口/loadtracks?identifier=ytsearch:travis scott fe!n" \ -H "Authorization: 你的Lavalink密码" \ -H "Content-Type: application/json"
- 若请求返回error:问题出在Lavalink节点本身,重点排查网络、YouTube源配置
- 若请求正常返回tracks:问题出在Poru或机器人代码,继续下一步
3. 检查Poru搜索格式
确保Poru调用搜索时,添加了明确的源前缀,否则可能使用非预期的搜索源:
// 错误示例:仅传入关键词,Poru可能无法识别搜索源 const result = await poru.resolve("travis scott fe!n"); // 正确示例:指定YouTube搜索前缀 const result = await poru.resolve("ytsearch:travis scott fe!n"); // 若需YouTube Music搜索,用ytmsearch前缀 const result = await poru.resolve("ytmsearch:travis scott fe!n");
4. 开启Lavalink DEBUG日志排查
调整application.yml日志级别为DEBUG,查看搜索请求的详细过程:
logging: level: lavalink: DEBUG
重启Lavalink后发起搜索,检查日志中是否有YouTube请求的错误状态码(如403、429),这类信息可能隐藏在普通日志级别下。
5. 确认Poru与Lavalink版本兼容
确保使用的Poru版本适配当前Lavalink版本:
- 新版Poru(v4+)需搭配Lavalink v4及以上
- 旧版Poru可能无法兼容Lavalink v4的通信协议
若以上步骤仍无法解决,可提供播放命令的核心代码,进一步定位问题。
内容的提问来源于stack exchange,提问作者Calais

