Невозможно вернуть функцию промежуточного программного обеспечения в ExpressJS app.use () для пользовательского ведения журнала. - PullRequest
0 голосов
/ 28 апреля 2020

Я Java разработчик и не очень опытный в мире NodeJS / JavaScript. Я написал файл TypeScript для пользовательского регистратора и пытаюсь использовать его в других микросервисах (написанный на Express / Node) в качестве NPM модуля импорта.

Я могу записать вывод на консоль, как logger.log («фиктивное сообщение»); но я не могу передать это как функцию moddileware в app.use (logger ()). Ошибка ниже: -

**

% npm start
> aws-sample-app@1.0.0 start /Users/aws-sample-app
> node index.js
/Users/mydevelopment/aws-sample-app/node_modules/express/lib/application.js:210
    throw new TypeError('app.use() requires a middleware function')
    ^
TypeError: app.use() requires a middleware function
    at Function.use (/Users/mydevelopment/aws-sample-app/node_modules/express/lib/application.js:210:11)
    at Object.<anonymous> (/Users/mydevelopment/aws-sample-app/index.js:21:5)
    at Module._compile (internal/modules/cjs/loader.js:1123:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1143:10)
    at Module.load (internal/modules/cjs/loader.js:972:32)
    at Function.Module._load (internal/modules/cjs/loader.js:872:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47
npm ERR! code ELIFECYCLE

**

Я импортирую и вызываю вот так в другом микросервисе: -

const logger = require('@test/aws-logging-framework/src/custom-logger').logger('hello-app', myobject);
const app = express();
app.use(logger());
app.set('PORT', (process.env.PORT || 3002));
app.use(bodyPraser.urlencoded({extended: false}));
app.use(bodyPraser.json());

app.get('/', function(request, response){
    logger.info('hello message');
    response.send('custom logging (JSON)');
}

Это мой пользовательский модуль логгера: -

'use-strict';

let keys: Array<string> = ['hostname'];

const CN: string = 'my-logger';

const LEVEL: string = 'trace';

const MASKED: string = 'CONTENT MASKED';

const updatedKeys = (options) =>{
    if(options !== undefined && options !== null){
        if (options.hasOwnProperty("blacklisted")) {
            options['blacklisted'].forEach(element => {
                keys.push(element);
            });
        }
        if (options.hasOwnProperty("whitelisted")) {
            keys = keys.filter(function(x) {
                return options['whitelisted'].indexOf(x) < 0;
            });
        }
    }
    return keys;
  }

const logger = (name: string, options) => require("pino")({
    name: (name !== null && name !== undefined) ? `${CN}-${name}` : CN,
    level: LEVEL,
    redact: {
      paths:updatedKeys(options),
      censor(...args) {
        console.log(`[censor method] ${JSON.stringify(args)}`);
        return MASKED;
      }
    },
    mixin() {
      return { mixinCalled: 1 };
    }
});

module.exports.logger = (name: string, options) => {
  (...obj) => {
      console.log('object::::::', ...obj);
      console.log('obj::', obj.length);
      return new logger(name, options)(obj);
  }    
}

Ниже приведены 2 проблемы с кодом: -

  • Я не могу использовать 'новый 'ключевое слово в модуле логгера (возвращать новый логгер (имя, опции) (obj);) как получающее эту ошибку "Только ключевое слово" функция "может быть вызвано с ключевым словом" новый "."

  • Невозможно использовать его в качестве функции промежуточного программного обеспечения в других службах (app.use (logger ());)

Я много пытался отладить его, но не нашел никакого конкретного решения. Пожалуйста, помогите сообщить мне об этом, а также объясните мне причину root, чтобы я мог ее хорошо понять и позаботиться в следующий раз.

...