现在有一个接口被连续两次重复调用,已经在各个返回分支上都加了return, 但是连续两次调用同一个RESTFul接口还是会出现 “Can’t set headers after they are sent” 异常。
请问一下Nodejs 怎么避免这种重复的调用呢? 求大神指点。
有木有人啊
前后端校验都检查一下,实在不行就加上java里的那种令牌环
这明显是express 或 nodejs 常见错误,异步代码和下面的代码同时执行了, 你不贴代码无法判断哪错了,return 肯定不行,把下面的代码放到异步成功的callback 函数里面。 不要放到下面就可以了
@jinwyp 代码有点多,我大概描述一下。
function getDiskInfo(req, res){ var sendCMD = function(connection){ // send cmd } var processDiskInfoResult = function(connection, result){ // 各种结果判断,数据处理,返回相应的 response // 在这里报错。 }
// CreateConnectionWithMonitorNode 是另外一个文件里的函数,用来创建与另一个节点的websocket的连接,并发送消息,返回消息。
monitorNodeConnection.CreateConnectionWithMonitorNode(nodeIP, port, sendCMD, processDiskInfoResult, null);
}
当getDiskInfo 这个请求第一次因为websocket连接卡主,再紧接着执行第二次时候,就会出现“Can’t set headers after they are sent” 异常。 整个逻辑大概是这样,现在还是nodejs理解浅薄,不知道应该怎么修改。
刚好昨天在做了个 async 源码解析的视频教程… <del>等回头整理好顺便打个广告</del> 可以考虑用闭包, callback 之前用 onlyOnce(callback) 然后再调用
function onlyOnce(cb) {
let flag = false;
return (...args) => {
if (flag) {
return cb(new Error('cb already called'));
}
cb.apply(null, args);
flag = true;
};
}
当然你也可以选择不报错, 直接忽略, 不过这里把栈打出来还是挺方便调试的.
广告: Node.js 实践教程 https://github.com/ElemeFE/node-practice
@lellansin 啥都木有,骗star…
@npmstudy 就录了个视频以点, 别的最近在整理… 稍微有点波折 (拖延症见谅)