Ao tentar ler dados em Node. js de um processo filho ImageMagick, ele sai corrompido. Um caso de teste simples seria o seguinte: espero que seja o equivalente à linha de comando converter. test. jpg - gt test2.jpg que escreva o arquivo binário corretamente. Originalmente havia um problema com a opção maxBuffer sendo muito pequena e resultando em um arquivo truncado. Após aumentar isso, o arquivo agora aparece um pouco maior do que o esperado e ainda corrompido. Os dados do stdout são necessários para enviar sobre HTTP. Qual seria a maneira correta de ler esses dados a partir do ImageMagick stdout perguntou May 28 11 at 20:09 Se o tempo limite for maior que 0, então ele irá matar o processo filho se ele for executado por mais de milissegundos timeout. O processo filho é morto com killSignal (padrão: SIGTERM). MaxBuffer especifica a maior quantidade de dados permitido no stdout ou stderr - se esse valor for excedido, o processo filho será morto. Então, se sua imagem exceder o tamanho padrão do buffer de 2001024 bytes, sua imagem será corrompida como você mencionou. Eu consegui fazê-lo funcionar com o seguinte código: Aqui usei o spawn para obter um stdout streamable, então usei um Stream Writeable para escrever os dados em formato binário. Apenas o testei e pude abrir a imagem resultante de test2.jpg. EDITAR. Sim, você pode usar isso para enviar o resultado através de HTTP. Heres um exemplo de mim downsizing uma imagem com converter, em seguida, postar o resultado para o glowfoto API: answer May 28 11 at 20:57 Obrigado, it39s true Eu perdi completamente a opção maxBuffer, mas doesn39t parecem resolver a corrupção. Se você ampliar isso com o meu exemplo o arquivo resultante não é mais pequeno, mas ainda corrompido. Seu exemplo funciona, mas eu realmente preciso fazer mais com os dados do que canalizá-lo diretamente para outro arquivo. Mais especificamente, eu precisaria escrevê-lo em uma resposta HTTP usando a estrutura expressa, por exemplo. Ndash Daniel Cremer 28 de maio às 22:06 Daniel Eu tentei apenas mudando a linha de geração para. Var converter spawn (39convert39, 39test. jpg39, 39-resize39, 395039, 39-39) e obteve um arquivo JPEG de trabalho reduzido 50. Tente atualizar sua postagem com o que você tem agora. Ndash onteria 28 de maio às 22: 12Leitura de texto e dados binários com fluxos legíveis Node. js Este tutorial irá explicar o uso e criação de fluxos read. js readable: Informações sobre a versão Jeff Barczewski Tags: nodejs, Node. js v0.10 (último estável é v0.10.15 até à data desta escrita), mas os córregos foram geralmente uma parte de Node. js de seus dias adiantados Streams2 pode ser Usado com versões mais antigas do nó usando o módulo npm readable-stream Consumindo ou usando fluxos legíveis Exemplo simples de leitura de um arquivo e ecoando para stdout: Criando um sha1 digest de um arquivo e ecoando o resultado para stdout (similar a shasum): O evento de dados é disparado no fluxo legível para cada pedaço de dados, para que você atualize o resumo com cada pedaço ao mesmo tempo, e finalmente o evento final é disparado quando o fluxo finalizou para que você possa produzir o resultado final. Note que cada vez que você chama. on () para registrar um ouvinte ele retorna o fluxo original para que você possa encadear métodos facilmente. Com Node. js 0.10 há uma maneira melhor de consumir fluxos. A interface legível torna mais fácil trabalhar com fluxos, especialmente fluxos onde você quer fazer outras coisas entre criar um fluxo e usar o fluxo. Esses fluxos legíveis mais novos são puxar fluxos onde você solicita os dados quando é lido para ele, em vez de ter os dados enviados para você. A chave para entender este exemplo é que com a nova interface de leitura de streams2, um evento legível será emitido assim que os dados estiverem disponíveis para serem lidos e você pode chamar. read () para ler pedaços dele. Uma vez que não há mais dados disponíveis. Read () retorna null, mas então outro evento legível é acionado novamente quando os dados estiverem disponíveis novamente. Isso continua até o final do arquivo quando final é acionado como antes. Produzindo um fluxo legível Para usar fluxos com o sistema de arquivos ou do http, você pode usar os métodos core fs e http para construir um fluxo, mas como você criaria seu próprio fluxo e o preencheria com dados. Isso pode ser dados de um banco de dados ou De qualquer número de fontes. Aqui está um exemplo de criação de um fluxo legível que é gerado a partir de dados aleatórios binários, em seguida, hash como antes. Isso seria útil na criação de fluxos para testes: Nota: depois de ler () é chamado, devemos continuar lendo até terminar ou até push () retornar false. Usando Streams2 com versões mais antigas do Node. js Se você quiser fazer este código funcionar com o Node. js mais antigo que 0.10, você pode incluir uma dependência para readable-stream em seu pacote. json e alterar a linha 5 para ler: Fluxo legível se Node. js versão é 0.10 e se não, então ele irá carregar o módulo polyfill readable-stream e usá-lo a partir daí. Pausar o currículo do fluxo e do Streams2 Uma vez que os fluxos podem às vezes fornecer dados mais rapidamente do que um aplicativo pode consumi-lo, os fluxos incluem a capacidade de pausar e os dados são armazenados em buffer até que o fluxo seja reiniciado. Antes dos streams2, você precisaria prestar muita atenção para pausar e retomar métodos, bem como buffering os dados até retomada. No entanto, Readable de streams2 (Node. js 0.10 ou através do pacote readable-stream) implementa que a funcionalidade para você e os streams são pausados automaticamente até que. read () seja chamado. Você também pode envolver fluxos antigos com uma legível para implementar a nova interface no fluxo antigo: Outra situação onde você precisa se preocupar com pausa e currículo é se o seu consumo de código usa a interface de estilo antigo push chamar. on (39data39, ouvinte). Isso coloca o fluxo no modo de compatibilidade com versões anteriores e você precisaria chamar. pause () e. resume () para controlar a taxa de dados que chegam à sua aplicação. Consulte os documentos da API do Stream para obter detalhes se você estiver usando a interface mais antiga no seu código. Transmissão de Objetos Inicialmente, quando os fluxos foram introduzidos, a API oficial indicou que os pedaços de dados sendo transmitidos seriam Buffers ou strings, porém muitos usuários descobriram que era ótimo poder transmitir objetos também. Streams2 in Node. js 0.10 adicionou um modo de objeto a fluxos para formalizar como isso deveria funcionar. Quando no modo de objeto. Read (n) simplesmente retorna o próximo objeto (ignorando o n). Para alternar um fluxo para o modo de objeto, defina a propriedade objetoMode como verdadeira nas opções usadas para criar seu fluxo legível. Assim, você pode usar objetos em fluxos com a mesma facilidade possível para usar Buffers e strings, mas a única limitação é que os objetos que você Pass não pode ser nulo, uma vez que irá indicar que o fluxo foi encerrado. Os fluxos legíveis Node. js são flexíveis e os fluxos legíveis simples Node. js são fáceis de consumir e até simples de construir. Você também não pode transmitir dados binários e de string, mas também objetos e ainda aproveitar a funcionalidade de fluxo. Espero que tenha gostado deste passeio rápido de fluxos legíveis, me avise se você tiver alguma dúvida. Para leitura adicional Compartilhe esta páginaSe você estiver usando o node. js por algum tempo, youve definitivamente executado em córregos. Conexões HTTP são streams, arquivos abertos streams stdin, stdout e stderr são todos os streams também. Um fluxo é nodos IO abstração - se você sente que ainda precisa compreendê-los melhor, você pode ler mais sobre eles aqui córregos fazem para uma abstração muito útil, e há muito o que você pode fazer com eles - como um exemplo, permite levar Um olhar para stream. pipe, o método utilizado para tomar um fluxo legível e conectá-lo a um vapor gravável. Suponha que queremos gerar um processo nó filho e canalizar nosso stdout e stdin para seu correspondente stdout e stdin. Lá você o tem - spawn o REPL do nó como um processo da criança, e tubulação seu stdin e stdout a seu stdin e stdout. Certifique-se de ouvir o evento de saída childs, também, ou então o seu programa vai simplesmente pendurar lá quando a REPL sai. Outro uso para stream. pipe é fluxo de arquivos. Em node. js, fs. createReadStream e fs. createWriteStream são usados para criar um fluxo para um descritor de arquivo aberto. Agora vamos olhar como um pode usar stream. pipe para gravar em um arquivo. Você provavelmente reconhecerá a maior parte do código: Com essas pequenas adições, o seu stdin eo stdout do seu REPL serão enviados para o fluxo de arquivos graváveis que você abriu para myOutput. txt. Seu que simples - você pode canalizar córregos a tantos lugares como você quer. Outro caso de uso muito importante para stream. pipe é com solicitação HTTP e objetos de resposta. Aqui temos o tipo de proxy mais simples: também é possível usar stream. pipe para enviar solicitações de entrada para um arquivo para log, ou para um processo filho, ou qualquer uma de várias outras coisas. Esperemos que isso tenha mostrado o básico de usar stream. pipe para passar facilmente seus fluxos de dados ao redor. É realmente um pequeno truque poderoso em node. js, e seus usos são seus para explorar. Codificação feliz e tente não cruzar seus streams Uma maneira simples de executar scripts Python de Node. js com comunicação inter-processo básica mas eficiente e melhor tratamento de erros. Criação de scripts Python em um processo filho Modos incorporados de texto, JSON e binário Analisadores e formatadores personalizados Transferências de dados simples e eficientes através de fluxos stdin e stdout Rastreios de pilha estendidos quando um erro é lançado Para executar os testes: Executando um script Python: If O script escreve para stderr ou sai com um código diferente de zero, um erro será lançado. Executando um script Python com argumentos e opções: Trocando dados entre Node e Python: Use. send (mensagem) para enviar uma mensagem para o script Python. Anexe o evento de mensagem para ouvir mensagens emitidas a partir do script Python. Use options. mode para configurar rapidamente como os dados são enviados e recebidos entre seus aplicativos Node e Python. Use o modo de texto para trocar linhas de texto Use o modo json para trocar fragmentos JSON use o modo binário para qualquer outra coisa (os dados são enviados e recebidos tal como estão) Para mais detalhes e exemplos incluindo o código-fonte Python, dê uma olhada nos testes. Tratamento de Erros e Rastreamentos de Pilha Estendidos Um erro será lançado se o processo sair com um código de saída diferente de zero ou se os dados tiverem sido gravados em stderr. Além disso, se stderr contém um rtbackback Python formatado, o erro é aumentado com detalhes de exceção Python incluindo um rastreamento de pilha concatenada. Erro de amostra com rastreamento (de testpythonerror. py): resultaria no seguinte erro: e err. stack ficaria assim: Construtor PythonShell (script, opções) Cria uma instância de PythonShell e inicia o script de processo Python. O caminho do script para executar opções. As opções de execução, que consistem em: mode. Configura como os dados são trocados quando os dados fluem através de stdin e stdout. Os valores possíveis são: text. Cada linha de dados (terminando com n) é emitida como uma mensagem (padrão) json. Cada linha de dados (terminando com n) é analisada como JSON e emitida como uma mensagem binária. Os dados são transmitidos tal como são através do formatador stdout e stdin. Cada mensagem a enviar é transformada usando este método, em seguida, anexado com n parser. Cada linha de dados (terminando com n) é analisada com esta função e seu resultado é emitido como uma codificação de mensagem. A codificação de texto para aplicar nos fluxos de processo filho (padrão: utf8) pythonPath. O caminho onde localizar o executável python. Padrão: python pythonOptions. O array de opções muda para passar para o python scriptPath. O caminho padrão onde procurar scripts. O padrão é o diretório de trabalho atual. Args. Array de argumentos para passar para o script Outras opções são encaminhadas para childprocess. spawn. As instâncias do PythonShell têm as seguintes propriedades: script. O caminho do script para executar comando. Os argumentos de comando completo passados para o executável stdin do Python. O fluxo stdin do Python, usado para enviar dados para o processo filho stdout. O fluxo stdout do Python, usado para receber dados do processo filho stderr. O fluxo stderr do Python, usado para comunicar erros childProcess. A instância de processo criada via childprocess. spawn foi encerrada. Booleano indicando se o processo saiu exitCode. O código de saída do processo, disponível após o término do processo Configura as opções padrão para todas as novas instâncias do PythonShell. Executar (script, opções, callback) Executa o script Python e invoca callback com os resultados. O callback contém o erro de execução (se houver) bem como uma matriz de mensagens emitidas a partir do script Python. Esse método também está retornando a instância do PythonShell. Envia uma mensagem para o script Python via stdin. Os dados são formatados de acordo com o modo selecionado (texto ou JSON) ou através de uma função personalizada quando o formatador é especificado. Analisa os dados recebidos do script Python escrito via stdout e emite eventos de mensagem. Esse método é chamado automaticamente como dados estão sendo recebidos do stdout. Fecha o fluxo stdin, permitindo que o script Python termine e saia. O retorno de chamada opcional é invocado quando o processo é encerrado. Aciona quando um pedaço de dados é analisado a partir do stdout fluxo através do método de recepção. Se um método analisador for especificado, o resultado dessa função será o valor da mensagem. Este evento não é emitido no modo binário. Fogos quando o processo foi encerrado, com um erro ou não. Incendeia quando o processo termina com um código de saída diferente de zero ou se os dados são gravados no stderr. Licença do MIT (MIT) Copyright (c) 2017 Nicolas Mercier É concedida permissão a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o Software), para negociar o Software sem restrições, inclusive sem Limitação dos direitos de utilização, cópia, modificação, fusão, publicação, distribuição, sublicença e / ou venda de cópias do Software e permitir que pessoas a quem o Software seja fornecido a fazê-lo, sujeitas às seguintes condições: Este aviso de permissão deve ser incluído em todas as cópias ou partes substanciais do Software. O SOFTWARE É FORNECIDO TAL COMO É, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO PROPÓSITO E NÃO-INFRAÇÃO. EM NENHUMA CIRCUNSTÂNCIA OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA ACÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTROS NEGÓCIOS NA PROGRAMAS.
No comments:
Post a Comment