Nodejs 怎么避免 RESTFul API 重复调用?
发布于 7 年前 作者 yuanbu2 4999 次浏览 来自 问答

现在有一个接口被连续两次重复调用,已经在各个返回分支上都加了return, 但是连续两次调用同一个RESTFul接口还是会出现 “Can’t set headers after they are sent” 异常。

请问一下Nodejs 怎么避免这种重复的调用呢? 求大神指点。

8 回复

有木有人啊

前后端校验都检查一下,实在不行就加上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;
  };
}

当然你也可以选择不报错, 直接忽略, 不过这里把栈打出来还是挺方便调试的.

@lellansin 啥都木有,骗star…

@npmstudy 就录了个视频以点, 别的最近在整理… 稍微有点波折 (拖延症见谅)

回到顶部