11

在 AWS Lambda 环境(Node.js 4.3)中运行时,我正在尝试调试在 node.js https 库环境中出现的套接字错误。此问题仅在高度间歇性且仅在重负载下发生。我的团队已经能够通过负载测试一致地重现该问题,我们希望从 https 模块启用调试日志记录。

我在节点文档中发现可以通过设置NODE_DEBUG=https环境变量来启用调试日志记录。但是,我不相信我可以设置环境变量:如何在 AWS Lambda 上使用环境变量?. 此外,我无法更改 Lambda 用来调用我的函数的命令行。

是否有另一种方法可以创建与设置相同的调试日志记录NODE_DEBUG

4

4 回答 4

5

这是一个猴子补丁:

const util    = require('util');
let debuglog  = util.debuglog;
util.debuglog = set => {
  if (set === 'https') {
    let pid = process.pid;
    return function() {
      let msg = util.format.apply(util, arguments);
      console.error('%s %d: %s', set, pid, msg);
    }
  }
  return debuglog(set);
}

// This has to occur _after_ the code above:
const https = require('https');

它基本上启用调试日志记录,https无论$NODE_DEBUG. 轻松重写以适用于任何模块,并使用 Node v4 和 v6 进行了测试。

于 2016-08-24T17:46:31.903 回答
1

child_process.fork()允许一个模块生成具有指定环境变量的新节点环境。这两个进程可以通过 相互发送消息send(),并通过“消息”事件接收这些消息。

例如,如果您当前的主模块名为server.js,那么您可以start.js在同一目录中添加一个临时模块(将是新的 lambda 函数),如下所示:

// Add NODE_DEBUG to this process's environment variables, which are passed by default to
// the forked node environment.
process.env.NODE_DEBUG = 'https';

const cp = require('child_process');
const n = cp.fork('server.js');

// Cached callback functions, in case client can pass in different callbacks.
// Use an object instead of array, to avoid memory leaks. 
const cbs = {};
var cbIndexCounter = 0; // To make callback indices unique

// Call appropriate callback with response from child process, and delete cached callback.
n.on('message', (m) => {
  cbs[m.cbIndex](m.error, m.result);
  delete cbs[m.cbIndex];
});

n.on('error', (err) => {
  console.log('Child node env error: ', err);
});

// Cache the callback; forward event, context, index to child process; and increment index.
exports.myHandler = function(event, context, callback) {
  cbs[cbIndexCounter] = callback;
  n.send({
    event: event,
    context: context,
    cbIndex: cbIndexCounter++
  });
}

server.js可以通过添加“消息”事件侦听器来稍微修改该模块:

process.on('message', (m) => {
  exports.myHandler(m.event, m.context, function(error, result) {
    process.send({
      error: error,
      result: result,
      cbIndex: m.cbIndex
    });
  });
});

// The rest of your original code ...
exports.myHandler = function (event, context, callback) {
   // Whatever you need here...
}
于 2016-08-24T17:25:57.980 回答
1

我不熟悉 Aws Lambda,但也许您仍然可以在命令中导出变量,如下所示:

NODE_DEBUG=https node app.js
于 2016-08-15T23:22:08.833 回答
0

运行以下命令:

node app.js --https-debug

在你的 app.js 里面有这个在脚本的开头

  process.argv.forEach((val, index) => {
    if(val.match(/--https-debug/)) {
      process.env.NODE_DEBUG = "https";
    }
  });

process.env 就像任何对象一样是一个对象,但是 node 在其上设置了环境变量,您始终可以破解它并覆盖从 node 全局环境设置的任何变量。

我们使用 process.argv 来捕获发送到终端节点 js 文件的所有参数。

于 2016-08-15T23:28:04.553 回答