2017-09-02 41 views
0

处理我必须接受上传文件的路径:不确定错误快递

在app.js

. 
. 
. 
var upload = require('./routes/upload'); 
. 
. 
. 
app.use('/upload', upload); 
. 
. 
. 

/* Need to start the application with NODE_ENV=production */ 
app.use(function (err, req, res, next){ 
    if (res.headersSent) { 
     return next(err) 
    } 
    res.status(500) 
    res.render('An error occured while trying to serve your request. Please send us an email if the error recurs.') 
}); 
app.listen(3000); 

而且在路线/ upload.js,我接受文件前检查文件类型和在数据库中创建一个条目。我还检查文件写入错误时,我试图通过调用next(ERR)内handleFileUpload传递到app.js错误处理程序,如下图所示:

var express = require('express'); 
var router = express.Router(); 
var path = require('path'); 
var mysql = require('mysql'); 
var multer = require('multer'); 
var fs = require('fs'); 
var db = require('../database'); 

var MAGIC_NUMBERS = { 
    jpg: 'ffd8ffe0', 
    jpg1: 'ffd8ffe1', 
    png: '89504e47' 
} 

/* Adapted from https://evdokimovm.github.io/javascript/nodejs/expressjs/multer/2016/11/03/Upload-files-to-server-using-NodeJS-and-Multer-package-filter-upload-files-by-extension.html */ 
function checkMagicNumbers(magic) { 
    if (magic == MAGIC_NUMBERS.jpg || magic == MAGIC_NUMBERS.jpg1 || magic == MAGIC_NUMBERS.png) 
     return true; 
} 

function handleFileUpload(req, res, next){ 
    var upload = multer({ 
     storage: multer.memoryStorage(), 
    }).single('fileUpload'); 

    upload(req, res, function(err) { 
     var buffer = req.file.buffer; 
     var magic = buffer.toString('hex', 0, 4); 
     var filename = req.file.fieldname + '-' + req.file.originalname.replace(/\s+/g,'') + '-' + Date.now() + path.extname(req.file.originalname); 

     if (checkMagicNumbers(magic)) { 
      fs.writeFile('/uploads/' + filename, buffer, 'binary', function(err) { 
       if (err){ 
        console.log(err); 
        return next(err); 
       } 
       else{ 
        req.savedfilename = filename; 
        next(); 
       } 
      }) 
     } else { 
      res.end('File is not of the following accepted types: jpeg, jpg, png.'); 
     } 
    }); 
} 

function handleDatabaseInsert(req, res, next) 
{ 
    db.insertRecord(req.body.name, req.body.email, req.body.message, 
     req.body.country, req.savedfilename, function(err, results){ 
      if(err) 
       next(err); 
    }); 
    res.end("Thank you for your participation! Please look forward to our email with updates."); 
} 

/* POST to Upload */ 
router.post('/', handleFileUpload, handleDatabaseInsert) 

module.exports = router; 

的问题是,当我试图赶上尝试写入文件并将其传递到app.js中的错误处理程序时,可能会发生错误,该错误处理程序在handleFileUpload内部,将调用下一个中间件handleDatabaseInsert,而不是使应用程序在app.js结束前使用的错误处理程序我让应用程序听。

这是预期的行为?我认为具有4个形式参数的函数将被调用来处理错误?

注:我故意用一个不存在的文件路径模拟写入错误,在这种情况下/上载/而不是./uploads/

谢谢!

回答

1

如果我理解正确,如果出现某种错误,您希望停止请求。要做到这一点,你只是不再叫next()

调用next()运行时创建如果你不希望它运行的下一个中间件项目不叫next()接下来的中间件功能。

你会想要做一些像res.send(500)代替next()或类似的东西。

如果你想创建一个错误处理程序,你可以这样做,以及:

http://expressjs.com/en/guide/using-middleware.html#middleware.error-handling

+0

我下面这个页面描述的错误处理机制:[错误在快速处理(HTTP:/ /expressjs.com/en/guide/error-handling.html)。因为它说调用next()以外的任何参数都会将该请求视为错误,并调用错误处理路由。我在app.js中有一个全局错误处理路线,并希望路线能够处理它。但我想我现在要通过使用res.end()来解决这个问题。 – mod0