node js解析器库如何工作

时间:2016-06-05 19:02:08

标签: javascript node.js

我无法理解像multer甚至body-parser这样的解析器库是如何工作的。从post请求中的哪些数据创建request.body。如果我使用html表单上传文件

<form method="post" action="/upload"  enctype="multipart/form-data">
        <input type="file" name="file"/>
        <input type="submit" value="upload">
</form> 

我只是按原样发布请求,我找不到上传文件的任何部分(如文件名或大小......)。但是当我使用multer时,它会出现在request.bodyrequest.file中,怎么样?

1 个答案:

答案 0 :(得分:1)

必须明确读取包含表单(或ajax请求等)中的数据的请求正文。可以使用requestIncomingMessage作为Readable stream来访问它。

例如,对bodyParser.urlencoded()的基本看法可以是以下内容,从request&#34; 流动模式&#34;中检索正文。使用'data''end'事件:

var querystring = require('querystring');

app.use(function (request, response, next) {
    // skip middleware if not relevant to the current request
    if ('application/x-www-form-urlencoded' !== request.headers['content-type'])
        return next();

    var chunks = [];

    // The 'data' event can occur multiple times
    // each given only part of the message.
    // So, just collect the parts at this point.
    request.on('data', function (chunk) {
        chunks.push(chunk);
    });

    // The 'end' event occurs once after all 'data' chunks have arrived.
    // Now, it's ready to parse.
    request.on('end', function () {
        try {
            // combine all of the 'data' chunks together
            var bodyContent = Buffer.concat(chunks);

            // parse and modify the `request` so the data is accessible later
            request.body = querystring.parse(bodyContent);

            next(); // success
        } catch (error) {
            next(error);
        }
    });

    request.on('error', function (error) {
        next(error);
    });
});