连接到AWS S3时Node.js崩溃
将我的应用程序从IntoVPS迁移到Digital Ocean后,当我的应用程序尝试将照片上载到AWS S3时崩溃 两台服务器之间的区别是:IntoVPS运行的是Ubuntu 10.10,Digital Ocean运行的是Debian;IntoVPS的节点为0.8.x,Digital Ocean的节点为0.10.26 我已经检查过,新服务器上没有可能导致此问题的防火墙 崩溃错误包括:连接到AWS S3时Node.js崩溃,node.js,amazon-s3,debian,digital-ocean,knox-amazon-s3-client,Node.js,Amazon S3,Debian,Digital Ocean,Knox Amazon S3 Client,将我的应用程序从IntoVPS迁移到Digital Ocean后,当我的应用程序尝试将照片上载到AWS S3时崩溃 两台服务器之间的区别是:IntoVPS运行的是Ubuntu 10.10,Digital Ocean运行的是Debian;IntoVPS的节点为0.8.x,Digital Ocean的节点为0.10.26 我已经检查过,新服务器上没有可能导致此问题的防火墙 崩溃错误包括: Error: read ECONNRESET at errnoException (net.js:904:1
Error: read ECONNRESET
at errnoException (net.js:904:11)
at Pipe.onread (net.js:558:19)
Error: spawn ENOENT
at errnoException (child_process.js:988:11)
at Process.ChildProcess._handle.onexit (child_process.js:779:34)
Error: write EPIPE
at errnoException (net.js:904:11)
at Object.afterWrite (net.js:720:19)
其中一些可能与永远尝试重新启动流程有关,我想这就是spawn的意思。我要关注的是EconReset
因此,我正在使用forever运行我的进程,并且我正在使用knox模块连接到S3
谷歌搜索后,我发现:
我尝试将res.resume添加到putFile的回调中,就像在中所说的那样,但没有任何变化;我仍然得到EconReset错误
我昨天花了一整天的时间试图解决这个问题,我无法继续让我的生产应用程序被破坏,所以我决定尝试切换到旧版本的Node,以便临时但快速地解决这个问题。因此,我安装了n模块,尝试将0.8.26作为安装的节点版本。不幸的是,n不起作用,下面是我在上面创建的问题:
编辑:
退出ssh会话并打开新会话后,n正在工作。但是,切换到节点的0.8.26版本会导致另一个错误:
/apps/Foobar/node_modules/dnode/node_modules/weak/node_modules/bindings/bindings.js:83
throw e
^
Error: Module version mismatch, refusing to load.
at Object.Module._extensions..node (module.js:485:11)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at bindings (/apps/Foobar/node_modules/dnode/node_modules/weak/node_modules/bindings/bindings.js:76:44)
at Object.<anonymous> (/apps/Foobar/node_modules/dnode/node_modules/weak/lib/weak.js:1:97)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (/apps/Foobar/node_modules/dnode/index.js:5:12)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (/apps/Foobar/controllers/sock.js:2:13)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at global.Controller (/apps/Foobar/globals.js:2:9)
at Object.<anonymous> (/apps/Foobar/controllers/generosity.js:209:12)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at global.Controller (/apps/Foobar/globals.js:2:9)
at Object.<anonymous> (/apps/Foobar/app.js:282:1)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.runMain (module.js:492:10)
at process.startup.processNextTick.process._tickCallback (node.js:245:9)
所有照片无论大小或格式都会导致相同的错误。我发现问题不在于AWS和knox,而在于gm以及GraphicsMagick没有安装在我的系统上这一事实
如果您遇到类似的错误,请记住,gm不会报告GraphicsMagick或ImageMagick在不存在时不存在。我在此处的gm模块上报告了此错误:关于您的更新问题-可能是我的问题,但您是否清除了node_模块,然后在降级node后重新安装?有一种猜测是,0.8.x和0.10.x之间的突破性变化正在影响您拥有的模块。此外,我不知道npm是否足够聪明,是否能够基于引擎安装正确的旧版本,因为引擎可能并不总是对模块有用,或者您是否需要手动指定版本。我自己也没有机会降级。也许有人可以确认这种情况下的npm行为。文档没有指定我可以看到。
// S3
var endpoint = "https://s3.amazonaws.com/"+global.config.aws.s3.bucket+"/";
var knox = require('knox');
var s3 = knox.createClient(global.config.aws.s3);
var photosPrefix = 'photos/';
var model = module.exports;
model.emitter = new events.EventEmitter;
// ::Photos
model.createPhoto = function(info, cb){
if (!info.file || path.resolve(info.file) === path.resolve(global.__tempdir))
return cb(new Error('missing info.file'));
var db = info.db;
var photoId;
if (typeof info.public === 'undefined')
info.public = false;
// Move file to a specific location
var basename = path.basename(info.file);
var destination = photosPrefix+basename+'/original';
yarn
(function(){
// Upload photo to AWS
s3.putFile(
info.file,
destination,
{
'Content-Type': 'image/png'
},
this());
})
(function(err, res){
if (err) return this.error(new Error(err));
// Remove temporary file
fs.unlink(info.file, this());
})
(function(err){
if (err) return this.error(new Error(err));
// Retrieve photo stream from AWS
s3.getFile(destination, this());
})
(function(err, res){
if (err) return this.error(new Error(err));
// Get the dimensions of the photo using the stream (res)
gm(res).size(this());
})
(function(err, size){
if (err) return this.error(new Error(err));
// Insert record into photos table (include the dimensions, width and height)
db.query("INSERT photos (resource, width, height, public) VALUES (?, ?, ?, ?)", [basename, size.width, size.height, info.public], this());
})
(function(err, results){
if (err) return this.error(new Error(err));
photoId = results.insertId;
cb(null, photoId);
})
.error(function(err){
cb(err);
});
}