Почему Meteor перезапускается каждый раз, когда происходит определенный вызов Meteor.call? - PullRequest
0 голосов
/ 23 декабря 2018

(Этот вопрос помечен как возможно дублирующий, но это не так (насколько я могу судить), потому что другой вопрос касается того, КАК записать на локальный диск, и это не моя проблема. Я могу написать вна диске сервера нет проблем, но при этом происходит перезапуск Meteor.)

В моем клиентском коде есть Meteor.call (), который работает, как и ожидалось, при сохранении файлов Google Text для преобразования текста в речь на сервери создание ссылки на звуковые файлы в клиенте.Однако каждый раз, когда я выполняю вызов Meteor, сервер Meteor перезапускается через 2 секунды после завершения своих задач.Вот код клиента:

(client/main.js)
Meteor.call('get.tts.links', tempSoundPath, voice, currentForeign, 
currentExample, function(error, result) {
  if (error) {
    alert('Error');
  } else {
    Session.set("links", result);
    soundLink1 = 'tempsoundfiles/' + result[0] + ".mp3";
    if (!result[1]) soundLink2 = "";
    else soundLink2 = 'tempsoundfiles/' + result[1] + ".mp3";
  }
});

Вот как выглядит код сервера (извините за длину и избыточность - я не настоящий программист):

(server/main.js)
const textToSpeech = require('@google-cloud/text-to-speech');
....
....
'get.tts.links'(tempSoundPath, voice, currentForeign, currentExample) {
  var path = "";
  var soundFileId = "";
  var text1 = currentForeign;
  var text2 = currentExample;
  var fileId = makepass();

  const client = new textToSpeech.TextToSpeechClient();
  const request = {
    input: {
      text: text1
    },
    voice: {
      languageCode: "en-GB",
      ssmlGender: 'MALE'
    },
    audioConfig: {
      audioEncoding: 'MP3'
    },
  };
  client.synthesizeSpeech(request, (err, response) => {
    if (err) {
      console.error('ERROR:', err);
      return;
    }
    path = tempSoundPath + fileId + ".mp3";
    console.log("path = " + path);

    // Write the binary audio content to a local file

    fs.writeFile(path, response.audioContent, 'binary', err => {
      if (err) {
        console.error('ERROR:', err);
        return;
      }
    });
  });

  if (!text2 || text2 == "") {
    var result = [];
    result.push(fileId);
    return result;
  } else {
    var fileId2 = makepass();
    const request2 = {
      input: {
        text: text2
      },
      voice: {
        languageCode: voice,
        ssmlGender: 'FEMALE'
      },
      audioConfig: {
        audioEncoding: 'MP3'
      },
    };
    client.synthesizeSpeech(request2, (err, response) => {
      if (err) {
        console.error('ERROR:', err);
        return;
      }
      var path2 = tempSoundPath + fileId2 + ".mp3";

      // Write the binary audio content to a local file

      fs.writeFile(path2, response.audioContent, 'binary', err => {
        if (err) {
          console.error('ERROR:', err);
          return;
        }
      });
    });
    var result1 = [];
    result1.push(fileId, fileId2);
    return result1;
  }
}

Перезапускине форсируйте перезагрузку страницы (я вижу их только на метеорной консоли), но я думаю, что они немного замедляют работу.

1 Ответ

0 голосов
/ 24 декабря 2018

Я не знаю, какое у вас значение tempSoundPath, но оно ведет себя так, будто вы записываете файлы в каталог вашего проекта (где-то на сервере /...).

Meteor видит это как исходный кодизменить, перестроить и перезапустить сервер.

Это также не будет работать даже в производственной среде, поскольку у вас, вероятно, не будет доступа на запись в файловую систему.

Вам лучше либо записать файлы в базу данных, либо передать их в корзину S3.Есть метеорные пакеты, такие как ostrio :: files, которые помогут вам в этом.

...