调用OpenCPU长耗时函数未获取到sessionid,求排查解决
OpenCPU异步调用未返回SessionID问题排查
问题描述
在OpenCPU上部署了一个耗时约1小时的长运行函数,预期通过async=true参数触发异步执行并获取sessionid用于后续轮询,但调用后响应中未包含会话相关信息。
代码片段
let uri= "http://IP/ocpu/library/mypackage/R/myfunction/json" const formData = { 'param1' : 'value1', 'param2' : 'value2', 'file1': fs.createReadStream('files/.....'), 'file2': fs.createReadStream('files/...'), 'file3': fs.createReadStream('files/....') }; const response = await request.post({ uri: url, formData: formData, headers: { 'Content-Type': 'multipart/form-data' } qs: { async: true } }); console.log(response);
收到的响应
{"uri":{"protocol":"http:","slashes":true,"auth":null,"host":"..myIP..","port":80,"hostname":"MYIP","hash":null,"search":null,"query":null,"pathname":"/ocpu/library/mypackage/R/myfunction/json","path":"/ocpu/library/..../R/...../json","href":"http://MYIP/ocpu/library/mypackage/R/myfunction/json"},"method":"POST","headers":{"Content-Type":"multipart/form-data","host":"MYIP"}}
错误点及修复方案
变量名不匹配:定义的请求地址变量是
uri,但请求配置里写的是url,导致请求地址未正确传递。修复为:uri: uri,语法错误导致
async=true未生效:headers配置项末尾缺少逗号,导致qs参数未被正确解析,OpenCPU没接收到异步执行指令,自然不会返回sessionid。修复后配置:const response = await request.post({ uri: uri, formData: formData, headers: { 'Content-Type': 'multipart/form-data' }, // 添加逗号 qs: { async: true } });响应获取方式错误:当前打印的是整个request响应对象的元数据,而非OpenCPU返回的实际内容。需要获取响应的
body部分:console.log(response.body);异步执行成功时,OpenCPU会返回类似
/ocpu/tmp/x0123456789abcdef/的session路径,你可以用这个路径拼接轮询地址(比如http://IP/ocpu/tmp/x0123456789abcdef/R/.val/json)获取执行结果。
额外注意事项
- 确认OpenCPU服务器配置允许异步长运行任务,检查服务器超时设置是否能覆盖1小时的执行时间。
- 验证
fs.createReadStream的文件路径是否正确,确保文件能被正常读取,避免因文件问题导致请求失败。
内容的提问来源于stack exchange,提问作者geeky_monster
相关产品推荐
相关产品推荐

