JS- why is context not passed in to child function?

Viewed 41

I am trying to declare a logger object, then have a child function write to the log that was declared in the parent using the context. However the context appears to be undefined inside the children, whether I use an arrow function or not.

Is it possible to pass the winston object to the child function implicitly ie without having to pass a winston object as a parameter?

Error log output:

this main context: {}
undefined
l1 err: TypeError: Cannot read properties of undefined (reading 'winston')
    at l1 (MYPATH\cw_log_test_helper.ts:4:19)
    at run (MYPATH\cw_log_contexts.ts:30:7)
    at Object.<anonymous> (MYPATH\cw_log_contexts.ts:39:1)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Module.m._compile (MYPATH\node_modules\ts-node\src\index.ts:1371:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (MYPATH\node_modules\ts-node\src\index.ts:1374:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
{ l1: [Function: l1], r1: [AsyncFunction: r1] }
r1 err: TypeError: Cannot read properties of undefined (reading 'error')
    at r1 (MYPATH\cw_log_test_helper.ts:12:31)
    at run (MYPATH\cw_log_contexts.ts:31:7)
    at Object.<anonymous> (MYPATH\cw_log_contexts.ts:39:1)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Module.m._compile (MYPATH\node_modules\ts-node\src\index.ts:1371:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (MYPATH\node_modules\ts-node\src\index.ts:1374:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
bye

main.ts

var winston=require('winston');
var WinstonCloudWatch=require('winston-cloudwatch');
import { l1, r1 } from './cw_log_test_helper';
const AWS = require('aws-sdk');

AWS.config.update({
  region: 'us-east-1',
});


var run=()=>{
    let sname=`mylambda`
      var self=winston.add(new WinstonCloudWatch({
        name:sname,
        cloudWatchLogs: new AWS.CloudWatchLogs(),
        logGroupName: 'winston-testing',
        logStreamName: sname
      }));
    console.log(`this main context:`,this)
    winston.error('first');  //<<<<<<<<<<<<<<<<<<WORKS
    l1(`hello`)  //<<<<<<<<<<<<<<<<FAILS
    r1('hi')     //<<<<<<<<<<<<<<<<FAILS

    // flushes the logs and clears setInterval
    var transport = self.transports.find((t) => t.name === sname)
    transport.kthxbye(function() {
    console.log('bye');
    });
}
run()

cw_log_test_helper.ts:

export var l1=function(ltxt:string){
    console.log(this)
    try{
    (this as any).winston.error(ltxt);
    }catch(e){
        console.log(`l1 err:`,e)
    }
}
export var r1 = async (ltxt:string) => {
    console.log(this)
    try{
        (this as any).winston.error(ltxt);
}catch(e){
    console.log(`r1 err:`,e)
}
}
0 Answers
Related