Nodejs服务器有时无法使用multer,express,永久上传文件

时间:2015-09-17 03:56:42

标签: node.js express forever multer

我正在尝试构建一个简单的文件服务器来接收带有multipart / form-data的post请求中的文件,我遵循了multer教程,但似乎有些不太正确,它有时会返回500内部服务器错误。代码如下。

var express = require('express');
var multer  = require('multer');
var mkdirp = require('mkdirp');
var app = express();
var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    var dir = 'file/' + req.body.jobid + '/';
    mkdirp(dir, function(err) {
        if(err) {
            console.error(err);
        }
    });
    cb(null, dir);
    console.log("Upload: saved to " + dir + file.originalname);
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname);
  }
});

var upload = multer({ storage: storage });

app.post('/', upload.single("file"),function (req, res, next) {
  res.status(200).end();
  next(req,res);
});

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

错误发生在十分之一的每两个请求中。

我以前用来永远开始的代码

forever start app.js;

我是nodejs的新手,这种错误(偶尔发生的错误)正在扼杀我。

我添加了一些函数来记录可能的错误。

app.use(function(err, req, res, next) {
  console.error(err.stack);
  next(err);
});

app.use(function(err, req, res, next) {
  if (req.xhr) {
    res.status(500).send({ error: err.stack });
  } else {
    next(err);
  }
});

它记录了这样的事情:

Upload: saved to file/9974de5b-a9c7-4de2-92d0-5dcf277b3946/file123
Error: ENOENT, open 'file/9974de5b-a9c7-4de2-92d0-5dcf277b3946/file123'
    at Error (native)
Error: ENOENT, open 'file/9974de5b-a9c7-4de2-92d0-5dcf277b3946/file123'
    at Error (native)

1 个答案:

答案 0 :(得分:1)

可能发生的情况是,有时您的代码会抛出同步错误,默认情况下表示将转为500响应。在不知道错误是什么的情况下进行诊断非常困难。你应该做的是在var server之前添加一个错误处理程序,它将捕获错误并将它们记录到控制台。然后,当错误发生时,您将能够轻松地看到它并解决问题。

app.use(function(err, req, res, next) {
    console.log(err);
    next(err);
});

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

修改

将行cb(null, dir);向上移动一行,如下所示:

destination: function (req, file, cb) {
    var dir = 'file/' + req.body.jobid + '/';
    mkdirp(dir, function(err) {
        if(err) {
            console.error(err);
        }
        // move cb to here
        cb(null, dir);
    });

    console.log("Upload: saved to " + dir + file.originalname);
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname);
  }