调用Slack的search.messages接口为何返回object Promise?
问题原因
Slack Node SDK的所有client接口方法都是异步设计,返回的是Promise对象,你当前的写法没有等待Promise完成状态变更就直接打印变量,自然只会输出Promise对象本身的默认字符串形式,不会拿到实际接口返回的结果。
正确实现方案
方案1:使用.then()链式调用处理异步结果
你之前尝试.then()没生效大概率是逻辑位置写错了,正确写法如下:
app.client.search.messages({ token: user_token, query: "Hello world in:testing" }) .then(result => { // 接口请求成功后才会进入这个回调,result才是实际返回的数据 console.log("result: ", result); // 后续对返回结果的处理逻辑都要写在这个回调内部 }) .catch(error => { // 捕获接口请求报错,比如权限不足、参数错误等 console.error("接口请求失败: ", error); });
注意不要把对result的处理写在.then()外面,异步逻辑执行顺序晚于外层同步代码,外层拿不到回调内的返回值
方案2:使用async/await语法简化异步逻辑(更推荐)
如果你的运行环境支持ES7以上语法,用async/await写法可读性更高:
// 必须写在async标记的函数内部 async function searchSlackMessages() { try { const result = await app.client.search.messages({ token: user_token, query: "Hello world in:testing" }); console.log("result: ", result); // 后续处理逻辑 } catch (error) { console.error("接口请求失败: ", error); } } // 调用函数执行查询 searchSlackMessages();
额外排查点
如果调整写法后还是拿不到预期结果,可以检查以下项:
- 确认你的用户token已经授予了
search:read权限,且对应工作区已经重新安装生效 - 确认查询语句的格式符合Slack搜索语法,目标频道
testing确实存在且对应用户有权限访问 - 打印error对象查看具体报错信息,即可定位是权限、参数还是网络问题
内容的提问来源于stack exchange,提问作者David Morón
相关产品推荐
相关产品推荐

