使用Node中的GM出现“spawn ENOENT”错误

34

当我尝试像这样调整图像大小:

                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文件中执行。

为什么会出现这个错误?我该怎么解决?

编辑:GraphicsMagick可以正常工作,证明如下:

enter image description here


你安装了GraphicsMagick吗?并且,你正在使用什么平台?GM只在Mac OS X和Ubuntu上进行测试。 - robertklep
1
离题了:@ojtwist,这个屏幕截图是从哪个 IDE 中截取的? - epeleg
Eclipse(还允许您进行调试) - Olivier_s_j
你是否有设置这样一个环境的说明链接?我尝试过了,但迄今为止没有成功... - epeleg
完全不懂Node.js的我,使用“npm install gm”安装GraphicsMagick时,尝试上传/调整图像时一直出现“spawn ENOENT”错误。在执行“sudo apt-get install graphicsmagick”之后,一切都运行良好!希望这能为某些人节省大量的搜索时间 :) - iCreateAwesome
显示剩余3条评论
10个回答

67

安装ImageMagick并使用子类imageMagick。

  1. 安装ImageMagick

    sudo apt-get install imagemagick
    
  2. 使用Imagemagick的子类:

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

7
谢谢!这对我来说就是这样了。 - David Oliveros
谢谢,这解决了我在Heroku上的Node.js应用程序的问题。 - Devesh
1
GM还需要GraphicsMagick,就像在GM的Readme文件中提到的那样。当我安装它后,问题消失了。在Mac OS X中,可以使用brew install graphicsmagick进行安装。 - cespon
1
给CentOS的小伙伴们:yum install ImageMagick - yangsibai
这应该被标记为正确答案。非常感谢! - jwanglof
sudo apt-get install imagemagick
  • sudo apt-get install graphicsmagick 对我有用
- user3014311

10

我在Windows 7上运行Node.js,并安装了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时这样做:

OR you can do that when requiring gm, like so:

->

或者,您可以这样要求gm:

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

1
我可以确认这解决了我的OSX Mountain Lion问题。我使用macports安装它而不是brew,以防这能帮到某人。 - roy riojas

4

我在Windows上使用IIS运行Node.js应用程序时遇到了同样的问题。当我在适当的AppPool的"高级设置"中将"加载用户配置文件"选项设置为"True"时,问题已经解决。


哇!太感谢了。我花了很长时间才弄明白这个问题。你是怎么想到的我真的不知道,但还是非常感谢你! - TYRONEMICHAEL

2

我曾经遇到同样的问题,并按照以下方式解决它。

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,请先安装它。


1
我和你遇到了同样的问题,以下是解决方法。 在终端/控制台中,ImageMagick正常工作,但在nodejs(gm模块)中无法正常工作。经过两天的努力,我通过将PATH变量添加到环境变量process.env.PATH中来解决了这个问题。应该包含对您的imagemagick和其他可执行文件的路径。Node.js具有一些系统路径,但由于某种原因,GM忽略它并使用process.env.PATH。
我创建了环境变量PATH(process.env.PATH),并将值设置为bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin。我使用MAC OS X。
我使用brew安装了imageMagick(brew install imagemagick)。

1
另一种可能发生这种情况的场景(在使用Windows时)是当您尝试从UNC路径运行代码时。映射驱动器字母并通过映射的驱动器字母运行可以解决此问题。

你能举个例子吗?"running over"是什么意思? - Matiss
也许“running over”不是正确的术语。我的意思是你的node.exe应该从类似于n:\node\node.exe这样的位置运行,而不是从类似于\\myserver\myshare\node\node.exe这样的位置运行。 - epeleg

0

/gm/lib/command.js

有一个选项,您可以设置appPath,如果gm已经通过终端工作,您可以通过subClass函数获取gm的路径并传递它。在我的情况下,使用MacOsx上的brew安装了gm/usr/local/bin/中。

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

0
在我的情况下,这非常简单。它发生在我安装了Windows 10中的GraphicsMagick之后: 我尝试使用一个在安装GraphicsMagick之前已经打开的控制台。因此,它使用旧的路径信息,并且找不到GraphicsMagick。解决方案:我必须打开一个新的控制台来运行节点以使用gm。

0
由于我在stackoverflow上多次遇到这个问题,我想分享这个答案: https://stackoverflow.com/a/25461564/3970623 “spawn ENOENT”似乎是由于可用于使用PATH环境变量访问的有效Unix工具安装引起的。

0

如果有人在macOS上遇到这个错误,这对我有效:

$ brew install graphicsmagick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接