Подтвердить что ты не робот

Ошибка: вызвать ENOENT при использовании GM в node

Когда я пытаюсь изменить размер изображения следующим образом:

                gm('public/uploads/1710410635.jpg')
                .resize(240, 240)
                .noProfile()
                .write('public/uploads/1710410635_t.jpg', function (err) {
                  if (!err) console.log('done');
                });

Я получаю эту ошибку:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: spawn ENOENT
    at errnoException (child_process.js:945:11)
    at Process.ChildProcess._handle.onexit (child_process.js:736:34)

Моя файловая структура выглядит следующим образом:

enter image description here

Код выполняется в файле postnewsitem.js

почему возникает эта ошибка и как ее решить?

edit: GraphicsMagick работает, доказательство:

enter image description here

4b9b3361

Ответ 1

Установите ImageMagick и используйте subClass imageMagick.

  • Установить ImageMagick

    sudo apt-get install imagemagick
    
  • с помощью subclass imagemagick:

    var gm = require('gm').subClass({ imageMagick: true });
    

Ответ 2

Я запускаю nodejs в Windows 7 с установленными gm и imagemagick, и кажется, что между обоими модулями был конфликт, поэтому я немного искал язык и узнал, как его избежать. Я добавил эту строку и решил мою проблему ENOENT: var imageMagick = gm.subClass({ imageMagick: true }); поэтому код теперь выглядит следующим образом:

var gm = require('gm'); 
var imageMagick = gm.subClass({ imageMagick: true });

imageMagick('test/pig.jpg').rotate('green', 45).write('test/crazy_pig.jpg', function (err) {
    if (!err) console.log('crazy pig has arrived');
    else console.log(err);
})

ИЛИ вы можете сделать это, когда будете требовать gm, например:

var gm = require('gm').subClass({ imageMagick: true });

Ответ 3

Имела ту же проблему с приложением Node.js, запущенным в Windows с использованием IIS. Проблема исчезла, когда я установил параметр Загрузить профиль пользователя в " Дополнительные параметры" соответствующего AppPool для " True"

Ответ 4

Я столкнулся с той же проблемой и решил ее таким образом.

var gm = require('gm'); 

gm('public/uploads/1710410635.jpg').options({imageMagick: true}).resize(240,240).write('public/uploads/1710410635.jpg', function (err) {
if (!err) console.log('Done');
else console.log(err);
})

Примечание. Если вы не установили imageMagick. Пожалуйста, установите этот первый

Ответ 5

Другой сценарий, когда это может произойти (при использовании окон), - это попытка запустить код из UNC-пути. сопоставление букв диска и работа над сопоставленной буквой диска также решает эту проблему.

Ответ 6

У меня такая же проблема, как и вы, и это было РЕШЕНИЕ. ImageMagick корректно работал в терминале/консоли, но не в nodejs (модуль gm). Через 2 дня потери волос я исправил его, добавив переменную PATH в переменные среды process.env.PATH Должен быть путь к вашему imagemagick и другим исполняемым файлам. Node.js имеет некоторую PATH из системы, но для некоторого reasone GM игнорирует его и использует process.env.PATH

Я создал переменную среды PATH (process.env.PATH) и установил значение для бен:. node_modules/бен:/USR/локальные/бен:/USR/бен:/бен Я использую MAC OS X

У меня установлен imageMagick с brew (brew install imagemagick)

Ответ 7

Поскольку я много раз обнаружил эту проблему в stackoverflow, я хочу поделиться этим ответом: fooobar.com/questions/155879/...

"Инициатор ENOENT", по-видимому, вызван действительной установкой инструментов unix, доступной с использованием переменной среды PATH.

Ответ 8

В моем случае это было очень просто. Это стало возможным после установки GraphicsMagick в Windows 10: Я попытался использовать консоль, которая еще была открыта перед установкой GraphicsMagick. Поэтому он использовал информацию старого пути и не нашел GraphicsMagick. Решение. Мне пришлось открыть новую консоль для запуска node для использования gm.

Ответ 9

/gm/lib/command.js есть опция, где вы можете установить appPath, если gm уже работает через терминал, вы можете получить путь к gm и передать его через функцию subClass. В моем случае gm был установлен в/usr/local/bin/с помощью brew на MacOsx.

var gm = require('gm').subClass({ appPath: "/usr/local/bin/" });