-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathconnect.js
More file actions
66 lines (56 loc) · 1.62 KB
/
connect.js
File metadata and controls
66 lines (56 loc) · 1.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
const createError = require('http-errors')
const multiparty = require('multiparty');
const onFinished = require('on-finished');
const qs = require('qs');
const typeis = require('type-is');
function multipart (options) {
options = options || {};
return function multipart(req, res, next) {
if (req._body) return next();
req.body = req.body || {};
req.files = req.files || {};
if ('GET' === req.method || 'HEAD' === req.method) return next();
if (!typeis(req, 'multipart/form-data')) return next();
req._body = true;
let form = new multiparty.Form(options);
let data = {};
let files = {};
let done = false;
function ondata(name, val, data){
if (Array.isArray(data[name])) {
data[name].push(val);
}
else if (data[name]) {
data[name] = [data[name], val];
}
else {
data[name] = val;
}
}
form.on('field', function(name, val){
ondata(name, val, data);
});
form.on('file', function(name, val){
val.name = val.originalFilename;
val.type = val.headers['content-type'] || null;
ondata(name, val, files);
});
form.on('error', function(err){
if (done) return;
done = true;
let error = createError(400, err);
if (!req.readable) return next(error);
req.resume();
onFinished(req, () => next(error));
});
form.on('close', function() {
if (done) return;
done = true;
req.body = qs.parse(data, { allowDots: true });
req.files = qs.parse(files, { allowDots: true });
next();
});
form.parse(req);
}
};
module.exports = multipart