2016-04-27 7 views
1

Ich habe eine Express-App, die ich Sharp verwenden, um die Größe von Bildern zu ändern, nachdem ein Benutzer sie hochgeladen hat. Wenn ich die App mit 'npm start' starte, kann ich die Bilder ohne Probleme hochladen, aber wenn ich PM2 verwende, um den Prozess zu verwalten, werden die Bilder nicht auf dem Server gespeichert. Ich kann sie speichern, ohne Sharp zu verwenden, um sie zu skalieren, nur wenn ich den Code für sharp habe, werden sie nicht gespeichert. Unten ist der Code von meinem Controller. Multer verarbeitet die Form und Sharp skaliert das Bild.Sharp Bild-Uploader nicht funktioniert, wenn App mit PM2

doNewRecipe: function(req, res) { 
    for (var key in req.body) { 
     req.body[key] = req.body[key] || undefined; 
    } 
    var body = _.pick(req.body, 'title', 'description', 'ingredients', 'instructions', 'yield', 'prep_time', 'cook_time', 'categoryId'); 
    body.userId = req.session.user.id; 

    if (req.file) { 
     var tempPath = req.file.path, 
      ext = path.extname(req.file.originalname).toLowerCase(), 
      //targetPath = path.resolve(finalUploadPath + req.file.filename + ext); 
      targetPath = path.resolve(finalUploadPath); 
     fs.renameSync(tempPath, tempPath + ext); 
     var newFileName = req.file.filename + ext; 
     var imageFile = tempPath + ext; 


     body.image = newFileName; 

     sharp(imageFile) 
      .resize(450, 450) 
      .max() 
      .toFile('./public/finalUpload/' + newFileName, function(err, info) { 
       body.image = newFileName; 
       fs.unlinkSync(path.resolve(tempPath + ext)); 

       db.recipe.create(body).then(function(recipe) { 
        res.redirect('/recipe/view/' + recipe.id); 
       }, function(e) { 
        console.log(e.message); 
        res.render('error', {message: e.toString()}); 
       }); 
      }); 


     //fs.renameSync(tempPath, targetPath); 
    } else { 

     db.recipe.create(body).then(function(recipe) { 
      res.redirect('/recipe/view/' + recipe.id); 
     }, function(e) { 
      console.log(e.message); 
      res.render('error', {message: e.toString()}); 
     }); 
    } 
}, 
+0

Verwenden Sie eine Konfigurationsdatei "ecosystem.json", um Ihre App mit PM2 zu starten? Sie könnten die CWD-Parameter hinzufügen. – Zauker

+0

Ich habe gerade 'PM2 Start bin/www' verwendet, um die App zu starten. –

+0

es ist nicht das gleiche durchführen pm2 start /my/path/app.js dann cd/my/pfad; pm2 start app.js du könntest eine json-datei mit der startoption deiner app generieren und auch die 'cwd' (den pfad des arbeitsverzeichnisses) hinzufügen – Zauker

Antwort

0

Wenn Sie Pfad verwenden, um zu bestimmen, wo die Datei gespeichert werden soll, wird es problemlos von einem System zu einem anderen übertragen. Ich habe tatsächlich ein paar Variablen erstellt, um zu bestimmen, wo die Datei gespeichert werden soll. Unten ist mein Code.

if (process.env.NODE_ENV === 'production') { 
    var finalUploadPath = 'hidden'; 
    var googleTracking = true; 
} else if (process.env.NODE_ENV === 'staging') { 
    var finalUploadPath = 'hidden'; 
    var googleTracking = false; 
} else { 
    var finalUploadPath = 'hidden'; 
    var googleTracking = false; 
} 

sharp(imageFile) 
      .resize(450, 450) 
      .max() 
      .toFile(finalUploadPath + req.file.filename + '.jpg', function(err, info) { 
       body.image = req.file.filename + '.jpg'; 
       fs.unlinkSync(path.resolve(tempPath + ext)); 

       compressAndResize(path.resolve(__dirname, '../public/finalUpload/' + body.image)); 

       db.recipe.create(body).then(function(recipe) { 
        req.flash('success', 'Recipe created'); 
        res.redirect('/recipe/view/' + recipe.id + '/' + recipe.slug); 
       }, function(e) { 
        console.log(e.message); 
        req.flash('error', 'Error creating new recipe'); 
        res.render('error', {message: e.toString(), csrfToken: req.csrfToken(), google: googleTracking}); 
       }); 
      }); 
Verwandte Themen