twitst4tz

twitter statistics web application
Log | Files | Refs | README | LICENSE

README.md (6339B)


      1 # raw-body
      2 
      3 [![NPM Version][npm-image]][npm-url]
      4 [![NPM Downloads][downloads-image]][downloads-url]
      5 [![Node.js Version][node-version-image]][node-version-url]
      6 [![Build status][travis-image]][travis-url]
      7 [![Test coverage][coveralls-image]][coveralls-url]
      8 
      9 Gets the entire buffer of a stream either as a `Buffer` or a string.
     10 Validates the stream's length against an expected length and maximum limit.
     11 Ideal for parsing request bodies.
     12 
     13 ## Install
     14 
     15 This is a [Node.js](https://nodejs.org/en/) module available through the
     16 [npm registry](https://www.npmjs.com/). Installation is done using the
     17 [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
     18 
     19 ```sh
     20 $ npm install raw-body
     21 ```
     22 
     23 ### TypeScript
     24 
     25 This module includes a [TypeScript](https://www.typescriptlang.org/)
     26 declaration file to enable auto complete in compatible editors and type
     27 information for TypeScript projects. This module depends on the Node.js
     28 types, so install `@types/node`:
     29 
     30 ```sh
     31 $ npm install @types/node
     32 ```
     33 
     34 ## API
     35 
     36 <!-- eslint-disable no-unused-vars -->
     37 
     38 ```js
     39 var getRawBody = require('raw-body')
     40 ```
     41 
     42 ### getRawBody(stream, [options], [callback])
     43 
     44 **Returns a promise if no callback specified and global `Promise` exists.**
     45 
     46 Options:
     47 
     48 - `length` - The length of the stream.
     49   If the contents of the stream do not add up to this length,
     50   an `400` error code is returned.
     51 - `limit` - The byte limit of the body.
     52   This is the number of bytes or any string format supported by
     53   [bytes](https://www.npmjs.com/package/bytes),
     54   for example `1000`, `'500kb'` or `'3mb'`.
     55   If the body ends up being larger than this limit,
     56   a `413` error code is returned.
     57 - `encoding` - The encoding to use to decode the body into a string.
     58   By default, a `Buffer` instance will be returned when no encoding is specified.
     59   Most likely, you want `utf-8`, so setting `encoding` to `true` will decode as `utf-8`.
     60   You can use any type of encoding supported by [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme).
     61 
     62 You can also pass a string in place of options to just specify the encoding.
     63 
     64 If an error occurs, the stream will be paused, everything unpiped,
     65 and you are responsible for correctly disposing the stream.
     66 For HTTP requests, no handling is required if you send a response.
     67 For streams that use file descriptors, you should `stream.destroy()` or `stream.close()` to prevent leaks.
     68 
     69 ## Errors
     70 
     71 This module creates errors depending on the error condition during reading.
     72 The error may be an error from the underlying Node.js implementation, but is
     73 otherwise an error created by this module, which has the following attributes:
     74 
     75   * `limit` - the limit in bytes
     76   * `length` and `expected` - the expected length of the stream
     77   * `received` - the received bytes
     78   * `encoding` - the invalid encoding
     79   * `status` and `statusCode` - the corresponding status code for the error
     80   * `type` - the error type
     81 
     82 ### Types
     83 
     84 The errors from this module have a `type` property which allows for the progamatic
     85 determination of the type of error returned.
     86 
     87 #### encoding.unsupported
     88 
     89 This error will occur when the `encoding` option is specified, but the value does
     90 not map to an encoding supported by the [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme)
     91 module.
     92 
     93 #### entity.too.large
     94 
     95 This error will occur when the `limit` option is specified, but the stream has
     96 an entity that is larger.
     97 
     98 #### request.aborted
     99 
    100 This error will occur when the request stream is aborted by the client before
    101 reading the body has finished.
    102 
    103 #### request.size.invalid
    104 
    105 This error will occur when the `length` option is specified, but the stream has
    106 emitted more bytes.
    107 
    108 #### stream.encoding.set
    109 
    110 This error will occur when the given stream has an encoding set on it, making it
    111 a decoded stream. The stream should not have an encoding set and is expected to
    112 emit `Buffer` objects.
    113 
    114 ## Examples
    115 
    116 ### Simple Express example
    117 
    118 ```js
    119 var contentType = require('content-type')
    120 var express = require('express')
    121 var getRawBody = require('raw-body')
    122 
    123 var app = express()
    124 
    125 app.use(function (req, res, next) {
    126   getRawBody(req, {
    127     length: req.headers['content-length'],
    128     limit: '1mb',
    129     encoding: contentType.parse(req).parameters.charset
    130   }, function (err, string) {
    131     if (err) return next(err)
    132     req.text = string
    133     next()
    134   })
    135 })
    136 
    137 // now access req.text
    138 ```
    139 
    140 ### Simple Koa example
    141 
    142 ```js
    143 var contentType = require('content-type')
    144 var getRawBody = require('raw-body')
    145 var koa = require('koa')
    146 
    147 var app = koa()
    148 
    149 app.use(function * (next) {
    150   this.text = yield getRawBody(this.req, {
    151     length: this.req.headers['content-length'],
    152     limit: '1mb',
    153     encoding: contentType.parse(this.req).parameters.charset
    154   })
    155   yield next
    156 })
    157 
    158 // now access this.text
    159 ```
    160 
    161 ### Using as a promise
    162 
    163 To use this library as a promise, simply omit the `callback` and a promise is
    164 returned, provided that a global `Promise` is defined.
    165 
    166 ```js
    167 var getRawBody = require('raw-body')
    168 var http = require('http')
    169 
    170 var server = http.createServer(function (req, res) {
    171   getRawBody(req)
    172     .then(function (buf) {
    173       res.statusCode = 200
    174       res.end(buf.length + ' bytes submitted')
    175     })
    176     .catch(function (err) {
    177       res.statusCode = 500
    178       res.end(err.message)
    179     })
    180 })
    181 
    182 server.listen(3000)
    183 ```
    184 
    185 ### Using with TypeScript
    186 
    187 ```ts
    188 import * as getRawBody from 'raw-body';
    189 import * as http from 'http';
    190 
    191 const server = http.createServer((req, res) => {
    192   getRawBody(req)
    193   .then((buf) => {
    194     res.statusCode = 200;
    195     res.end(buf.length + ' bytes submitted');
    196   })
    197   .catch((err) => {
    198     res.statusCode = err.statusCode;
    199     res.end(err.message);
    200   });
    201 });
    202 
    203 server.listen(3000);
    204 ```
    205 
    206 ## License
    207 
    208 [MIT](LICENSE)
    209 
    210 [npm-image]: https://img.shields.io/npm/v/raw-body.svg
    211 [npm-url]: https://npmjs.org/package/raw-body
    212 [node-version-image]: https://img.shields.io/node/v/raw-body.svg
    213 [node-version-url]: https://nodejs.org/en/download/
    214 [travis-image]: https://img.shields.io/travis/stream-utils/raw-body/master.svg
    215 [travis-url]: https://travis-ci.org/stream-utils/raw-body
    216 [coveralls-image]: https://img.shields.io/coveralls/stream-utils/raw-body/master.svg
    217 [coveralls-url]: https://coveralls.io/r/stream-utils/raw-body?branch=master
    218 [downloads-image]: https://img.shields.io/npm/dm/raw-body.svg
    219 [downloads-url]: https://npmjs.org/package/raw-body