2017-09-29 10 views
0

私はアプリケーションにwinstonのログを導入しています。すべての情報やエラーレベルのログをwinstonの.info.errorに置き換えたいと思います。これまでのところ、app.listenコールバックから情報メッセージを記録しようとした時以外はすべて動作します。私はこれをやってみましたウィンストンinfoログでserver.jsconsole.logを交換したいと思います明示app.listenコールバックとしてログメッセージ

const app = require('./src/appStartup'); 

const appPort = process.env.PORT; 
app().listen(appPort,() => { 
    console.log('Info message here'); 
}); 

:ロガーは、私が持っている私のserver.jsファイルで

const app = require('express')(); 
const co = require('co'); 
const cors = require('cors'); 
const winston = require('winston'); 

const loggerTimeFormat =() => (new Date()).toLocaleTimeString(); 

const winstonLogger = new winston.Logger({ 
    transports: [ 
    new winston.transports.Console({ 
     timestamp: loggerTimeFormat, 
    }), 
    ], 
}); 

module.exports = function appStartup() { 
    co(function* services() { 
    app.db = mongo.connect(); 
    app.use(cors()); 
    app.set('logger', winstonLogger); 
    }).catch((e) => { 
    console.error(e); 
    }); 

    return app; 
}; 

を定義している

appStartup.jsファイル:

const app = require('./src/appStartup'); 
const appPort = process.env.PORT; 
const appObj = app(); 

appObj.listen(appPort, (appObj.get('logger')) => { 
    logger.info('Info message here'); 
}); 

それが正しい構文であるかどうかわかりませんが、appObjParsing error: Assigned to rvalueappObj.get('logger')になります。どのように私はこの仕事をすることができますどのようなアイデア?

+0

ロガー呼び出しに誤字があるようです。あなたはlogger.infoを持っていませんが、ロガーだけです。 – Sri

+0

@Sriはい、それは問題を解決しませんでしたが、それは誤植でした。 – user988544

答えて

1

これはどういう意味ですか?

appObj.listen(appPort, (logger = appObj.get('logger')) => { 
    logger.info('Info message here'); 
}); 

loggerappObj.get('logger')がデフォルト値であり、引数の名前です。

それを使用する必要はありませんときにも、あなたがco()を使用している、そしてそれは(すなわち、それは後app.set('logger', ...)を呼んだイベントループの次のティックでservices関数内のコードを実行しているため、その可能性が高い問題を引き起こしappObj.get('logger')と呼んでください)。

これを試してみてください:

module.exports = function appStartup() { 
    app.use(cors()); 
    app.set('logger', winstonLogger); 
    return app; 
}; 

EDITを:appStartupが何かを非同期に依存している場合、一つの解決策は、それからの約束を返すようになり、その "上流" 扱いになります。

module.exports = function appStartup() { 
    app.use(cors()); 
    app.set('logger', winstonLogger); 
    return mongo.connect().then(db => { 
    app.db = db; 
    return app; 
    }); 
}; 

// server.js 
const app = require('./src/appStartup'); 
const appPort = process.env.PORT; 

app().then(appObj => { 
    appObj.listen(appPort, (logger = appObj.get('logger')) => { 
    logger.info('Info message here'); 
    }); 
}).catch(e => { 
    console.error('Unable to create app', e); 
    process.exit(1); 
}); 

または最近の(8.x)Node.jsバージョンで動作するasync/awaitを使用してください:

module.exports = async function appStartup() { 
    app.use(cors()); 
    app.set('logger', winstonLogger); 
    app.db = await mongo.connect(); 
    return app; 
}; 

// server.js 
const app  = require('./src/appStartup'); 
const appPort = process.env.PORT; 

void async function() { // async IIFE 
    try { 
    var appObj = await app(); 
    } catch(e) { 
    console.error('Unable to create app', e); 
    process.exit(1); 
    } 
    appObj.listen(appPort, (logger = appObj.get('logger')) => { 
    logger.info('Info message here'); 
    }); 
}(); 
+0

ああ、意味が分かります。解析エラーは解決しましたが、appObj.get( 'logger' )は、私がappStartupアプリケーションで設定したとしても、未定義に戻ります。set( 'logger'、winstonLogger); – user988544

+0

@ user988544 'appObj'は新しいインスタンスのようです。 – robertklep

+0

これはまだ 'require( './ src/appStartup');'の新しいインスタンスです。だから、 'appStartup.js'でプロパティを設定する必要がありますか?私はおそらくこれを正しく理解していないでしょう。 – user988544

0

babel-eslintの既知の問題です。最新バージョンにアップグレードしてください。問題が解決されます。あなたはes5方法であなたの矢印機能を書き換える考慮しようとするかもしれ一時的な解決策として

Check this thread for more info

希望すると便利です。

+0

これは問題なのかどうかわかりませんが、バベルのバリデータをオンラインで試してみると、 "無効な左手側の矢印関数のパラメータ" – user988544

関連する問題