Ваша функция ничего не возвращает - отсюда undefined
.
В узле есть соглашение о asynchronous execution - функции должны принимать обратный вызов в качестве последнего аргумента, и этот обратный вызов передается ошибке и результат в качестве аргументов. Вы можете увидеть это в вашем примере:
exec("date +%Y-%m-%d", function(err, stdout, stderr){
var todaysDate = stdout.trim();
toHash(todaysDate);
});
exec
это ничего не возвращает - вместо этого он принимает вышеупомянутую функцию обратного вызова. Этот обратный вызов вызывается, когда действие завершено, и ему дается либо ошибка, либо все остальные аргументы. Если вы хотите вызвать функцию асинхронного вызова, вы должны быть также асинхронными! поэтому вы должны изменить свою функцию generateHash
на асинхронный.
Вы также можете заметить, что ваш обратный вызов до exec
не выполняет и не возвращает ничего, что он просто вызывает toHash
- тупики часто являются симптомами проблем с кодом.
Ваш код асинхронной может выглядеть следующим образом:
function generateHash(callback) {
var toHash = function(stdout){
return new Buffer(stdout).toString('base64');
};
exec("date +%Y-%m-%d", function(err, stdout, stderr){
var todaysDate = stdout.trim();
if(err) {
return callback(err);
}
callback(null, toHash(todaysDate));
});
};
generateHash(function(err, hash) {
console.log(hash);
});