Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/poppinss/request

Node.Js request wrapper used by AdonisJs framework
https://github.com/poppinss/request

adonis adonisjs node-req

Last synced: about 2 months ago
JSON representation

Node.Js request wrapper used by AdonisJs framework

Awesome Lists containing this project

README

        



# Request
[![circleci-image]][circleci-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url]

Wrapper over Node.js [req](https://nodejs.org/dist/latest/docs/api/http.html#http_class_http_incomingmessage) object to standardize and ease the process of reading data from HTTP requests.

## Table of contents

- [Features](#features)
- [Usage](#usage)
- [Config](#config)
- [Typescript support](#typescript-support)
- [API](#api)
- [Maintainers](#maintainers)

## Features
1. Support for reading plain and signed cookies (only when signed via [@poppinss/response](https://github.com/poppinss/response))
2. Handy methods for content negotiation.
3. Handles inconsistencies between certain headers like `referer` and `referrer`.
4. Reliably reads `ip address` of proxied requests.
5. Assigns distributed unique `x-request-id` to each request.

## Usage
Install the package from npm as follows:

```sh
npm i @poppinss/request

# yarn
yarn add @poppinss/request
```

and then use it as follows

```ts
import { Request, RequestConfigContract } from '@poppinss/request'
import { createServer } from 'http'

const config: RequestConfigContract = {
allowMethodSpoofing: false,
subdomainOffset: 2,
trustProxy: require('proxy-addr').compile('loopback'),
}

createServer((req, res) => {
const request = new Request(req, res, config)
res.end(`${request.id()} ${request.url()}`)
})
```

## Config


{


"allowMethodSpoofing": false


Since, standard HTML forms doesn't allow all HTTP verbs like PUT, DELETE and so on. The allowMethodSpoofing allows defining the HTTP method as a query string _method.



When allowMethodSpoofing = true and current request method is POST, then request.method() will give preference to the query string _method property, over the original request method.





"subdomainOffset": 2


Offset indicates the number of values to remove from the end of the URL seperated by ..



For example: For URL indicative.adonisjs.com, the request.subdomains() method will return an array with ['indicative'].





"trustProxy"


A method that allows you to selectively trust the proxy servers. Make sure to read proxy-addr docs.





"getIp"


Optionally define a method to determine the user Ip adress. The method is helpful, when you want to rely on a different property to find the user ip address.



For example: Nginx set x-real-ip header when used a proxy server.
In that case you can define your own getIp method for same.


getIp (request) {

// I am using nginx as a proxy server and want to trust 'x-real-ip'
return request.header('x-real-ip')
}




"secret"


Optional Define a secret to unsign and read cookies. Make sure you have used the same secret to sign the cookie via @poppinss/response package.





}

## Typescript support
The module is written in Typescript and exports following classes, types and interfaces.

```ts
import { Request, RequestContract, RequestConfigContract} from '@poppinss/request'
```

**RequestContract** is the interface that `Request` class adheres too. Since, you cannot extend concrete implementations in Typescript, you may need the interface to have a lossely typed flow.

```ts
Request.macro('cartValue', function () {
return Number(this.cookie('cart')) || 0
})
```

then, you need to add `cartValue` to the interface

```ts
import { RequestContract as BaseContract } from '@poppinss/request'

interface RequestContract extends BaseContract {
cartValue (): number
}

const request = new Request(req, res, config) as unknown as RequestContract
```

## API
Following are the autogenerated files via Typedoc

* [API](docs/README.md)

## Maintainers
[Harminder virk](https://github.com/thetutlage)

[circleci-image]: https://img.shields.io/circleci/project/github/poppinss/request/master.svg?style=for-the-badge&logo=appveyor
[circleci-url]: https://circleci.com/gh/poppinss/request "circleci"

[npm-image]: https://img.shields.io/npm/v/@poppinss/request.svg?style=for-the-badge&logo=npm
[npm-url]: https://npmjs.org/package/@poppinss/request "npm"

[typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript

[license-url]: LICENSE.md
[license-image]: https://img.shields.io/aur/license/pac.svg?style=for-the-badge