Javascript 此关闭是否会导致Node.js内存泄漏,还是编程错误?

Javascript 此关闭是否会导致Node.js内存泄漏,还是编程错误?,javascript,node.js,memory-leaks,winston,Javascript,Node.js,Memory Leaks,Winston,这不是的副本,因为这是ios/swift,这是javascript/nodejs 目前,我打算将其仅用于调试,并继续从任何地方(如mocha/test等)调用。。因此,它立即将格式良好的调试信息/(复杂的json对象)记录到测试文件夹中,而不是服务器控制台中 仍然很想理解其中的含义,因为对于此类函数的每次调用,都会依次调用require('winston'),我不确定这是否是一个好的做法,其次,我想确保内存泄漏 exports.debugLog = (() => { const w

这不是的副本,因为这是ios/swift,这是javascript/nodejs

目前,我打算将其仅用于调试,并继续从任何地方(如mocha/test等)调用。。因此,它立即将格式良好的调试信息/(复杂的json对象)记录到测试文件夹中,而不是服务器控制台中

仍然很想理解其中的含义,因为对于此类函数的每次调用,都会依次调用
require('winston')
,我不确定这是否是一个好的做法,其次,我想确保内存泄漏

exports.debugLog = (() => {
    const winston = require('winston');
    return winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        defaultMeta: {service: 'debug-service'},
        transports: [new winston.transports.File({filename: 'debug.log'})]
    })
})()

我不确定您认为代码的哪一部分会导致内存泄漏

exports.debugLog = (() => {
    const winston = require('winston');
    return winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        defaultMeta: {service: 'debug-service'},
        transports: [new winston.transports.File({filename: 'debug.log'})]
    })
})()
定期打电话不是问题:

const winston = require('winston');
模块是缓存的,因此在第一次加载模块后,对同一模块的后续调用
require()
会立即返回缓存的导出。这很快,一点问题都没有。在您的具体情况下,我可能会这样写:

const winston = require('winston');

exports.debugLog = winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        defaultMeta: {service: 'debug-service'},
        transports: [new winston.transports.File({filename: 'debug.log'})]
});
只是因为它更容易理解

根本不清楚为什么要使用额外的函数包装器
const winston
仅限于此模块,因此没有真正的理由试图将其隐藏在iLife和IMO中,因为包装器会使代码更加混乱,无法立即了解它在做什么

我仍然很想理解其中的含义,因为对于此类函数的每次调用,都会依次调用require('winston'),我不确定这是否是一种好的做法,其次,我想确保内存泄漏

exports.debugLog = (() => {
    const winston = require('winston');
    return winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        defaultMeta: {service: 'debug-service'},
        transports: [new winston.transports.File({filename: 'debug.log'})]
    })
})()
每次调用
debugLog()
都不会再次调用
require('winston')
debugLog
被分配了
winston.createLogger()
的结果,因此这是您反复调用的函数,而不是您创建的外部包装函数。该包装器函数在启动时只执行一次。

如果捕捉正确,可以将require('winston')移到外部。最初我需要一个块,我可以很容易地将粘贴复制到多个测试文件中,但后来我转移到了我的UTIL,但错过了将require('winston')移到外部的要点。有了这个,我可以简单地使它成为一个正则函数,而不是闭包。。。谢谢你抓住它。