Nodejs 服务器有时无法使用 multer、express、forever 上传文件
Nodejs server sometimes fails to upload files using multer, express, forever
我正在尝试构建一个简单的文件服务器来接收来自 post 使用 multipart/form-data 请求的文件,我遵循了 multer 教程,但似乎有些地方不太正确,有时 [=28] =] 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)
可能发生的情况是,有时您的代码会抛出同步错误,默认情况下 express 会变成 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);
}
我正在尝试构建一个简单的文件服务器来接收来自 post 使用 multipart/form-data 请求的文件,我遵循了 multer 教程,但似乎有些地方不太正确,有时 [=28] =] 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)
可能发生的情况是,有时您的代码会抛出同步错误,默认情况下 express 会变成 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);
}