2016-10-24 5 views
0

Я создаю приложение node.js и хотел бы напечатать несколько сообщений регистрации с номером версии. Сначала номер версии должен быть прочитан из файла свойств Java, поэтому я использую стороннюю библиотеку. Библиотека обеспечивает функцию синтаксического анализа(), но документация указано, что:node.js/socket.io/экспресс-исполнение

path - Boolean 
By default parse() reads a String. If you want to read a file, set this option to true. If this option is used, the callback is mandatory. It gets 2 parameters, a possible error and the object with all the properties. 

Теперь проблема Node.js является асинхронным, так что нет guarrentee, что номер версии готов перед печатью. Пожалуйста помоги.

var file_log='../log/log.txt'; 
var file_property='../backend/config.txt'; 

var log4js = require('log4js'); 
log4js.loadAppender('file'); 
log4js.addAppender(log4js.appenders.file(file_log), 'recon-frontend'); 
var logger = log4js.getLogger('recon-frontend'); 
logger.setLevel('info'); 

var arg = process.argv.slice(2); 
if(arg.length) { 
    arg = parseInt(arg); 
} 
else { 
    arg = 2334; 
} 

var express = require('express'); 
var app = express(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

http.listen(arg, function(){ 
    var properties = require("properties"); 
    var version; 
    properties.parse(file_property, { path: true }, function (error, obj){ 
     if(error) { 
      return console.error(error); 
     } 
     console.log(obj); 
     console.log(obj.version); 
     version = obj.version; 
    }); 
    logger.info("Recon frontend v"+version+" listening to port "+arg); 
}); 

Одним из возможных вариантов, конечно, чтобы поместить протоколирования предложение внутри функции обратного вызова разбора, но это сбивает с толку, потому что часть информации должна быть только готова, если привязка. Есть ли другое решение, пожалуйста? Благодарю.

+0

Результаты 'properties.parse()' может быть использовано ТОЛЬКО внутри обратного вызова. Вот как работает асинхронное программирование в node.js. И этот обратный вызов будет вызван в будущем. Если вы хотите, чтобы ваш вызов 'logger.info() выполнялся после того, как вы зарегистрировали версию, поместите ее внутри обратного вызова, где доступна версия. – jfriend00

ответ