docs: add res.lastModified and res.etag among other things
This commit is contained in:
parent
1dd1d02db0
commit
dc873d66e2
4 changed files with 75 additions and 61 deletions
|
@ -12,7 +12,7 @@
|
||||||
that they are added at this level, instead of a higher level framework,
|
that they are added at this level, instead of a higher level framework,
|
||||||
which would force middlware to re-implement this common functionality.
|
which would force middlware to re-implement this common functionality.
|
||||||
|
|
||||||
A `Context` is created _per_ request, and is referenced in middleware
|
A `Context` is created _per_ request, and is referenced in middleware
|
||||||
as the receiver, or the `this` identifier.
|
as the receiver, or the `this` identifier.
|
||||||
|
|
||||||
## Request aliases
|
## Request aliases
|
||||||
|
@ -72,7 +72,7 @@
|
||||||
Node's `request` object.
|
Node's `request` object.
|
||||||
|
|
||||||
### ctx.res
|
### ctx.res
|
||||||
|
|
||||||
Node's `response` object.
|
Node's `response` object.
|
||||||
|
|
||||||
### ctx.request
|
### ctx.request
|
||||||
|
@ -80,7 +80,7 @@
|
||||||
A koa `Request` object.
|
A koa `Request` object.
|
||||||
|
|
||||||
### ctx.response
|
### ctx.response
|
||||||
|
|
||||||
A koa `Response` object.
|
A koa `Response` object.
|
||||||
|
|
||||||
### ctx.app
|
### ctx.app
|
||||||
|
@ -93,6 +93,8 @@
|
||||||
|
|
||||||
- `signed` the cookie requested should be signed
|
- `signed` the cookie requested should be signed
|
||||||
|
|
||||||
|
Note: koa uses the [cookies](https://github.com/jed/cookies) module where options are simply passed.
|
||||||
|
|
||||||
### ctx.cookies.set(name, value, [options])
|
### ctx.cookies.set(name, value, [options])
|
||||||
|
|
||||||
Set cookie `name` to `value` with `options`:
|
Set cookie `name` to `value` with `options`:
|
||||||
|
@ -104,19 +106,21 @@
|
||||||
- `secure` secure cookie
|
- `secure` secure cookie
|
||||||
- `httpOnly` server-accessible cookie, __true__ by default
|
- `httpOnly` server-accessible cookie, __true__ by default
|
||||||
|
|
||||||
### ctx.error(msg, [status])
|
Note: koa uses the [cookies](https://github.com/jed/cookies) module where options are simply passed.
|
||||||
|
|
||||||
|
### ctx.throw(msg, [status])
|
||||||
|
|
||||||
Helper method to throw an error with a `.status` property
|
Helper method to throw an error with a `.status` property
|
||||||
that will allow Koa to respond appropriately. The following
|
that will allow Koa to respond appropriately. The following
|
||||||
combinations are allowed:
|
combinations are allowed:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
this.error(403)
|
this.throw(403)
|
||||||
this.error('name required', 400)
|
this.throw('name required', 400)
|
||||||
this.error('something exploded')
|
this.throw('something exploded')
|
||||||
```
|
```
|
||||||
|
|
||||||
For example `this.error('name required', 400)` is requivalent to:
|
For example `this.throw('name required', 400)` is requivalent to:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
var err = new Error('name required');
|
var err = new Error('name required');
|
||||||
|
@ -125,8 +129,7 @@ throw err;
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that these are user-level errors and are flagged with
|
Note that these are user-level errors and are flagged with
|
||||||
`err.expose` meaning the messages are appropriate for
|
`err.expose` meaning the messages are appropriate for
|
||||||
client responses, which is typically not the case for
|
client responses, which is typically not the case for
|
||||||
error messages since you do not want to leak failure
|
error messages since you do not want to leak failure
|
||||||
details.
|
details.
|
||||||
|
|
|
@ -53,6 +53,8 @@ http.createServer(app.callback()).listen(3001);
|
||||||
|
|
||||||
Return a callback function suitable for the `http.createServer()`
|
Return a callback function suitable for the `http.createServer()`
|
||||||
method to handle a request.
|
method to handle a request.
|
||||||
|
You may also use this callback function to mount your koa app in a
|
||||||
|
Connect/Express app.
|
||||||
|
|
||||||
### app.use(function)
|
### app.use(function)
|
||||||
|
|
||||||
|
@ -62,12 +64,12 @@ http.createServer(app.callback()).listen(3001);
|
||||||
### app.keys=
|
### app.keys=
|
||||||
|
|
||||||
Set signed cookie keys.
|
Set signed cookie keys.
|
||||||
|
|
||||||
These are passed to [KeyGrip](https://github.com/jed/keygrip),
|
These are passed to [KeyGrip](https://github.com/jed/keygrip),
|
||||||
however you may also pass your own `KeyGrip` instance. For
|
however you may also pass your own `KeyGrip` instance. For
|
||||||
example the following are acceptable:
|
example the following are acceptable:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
app.keys = ['im a newer secret', 'i like turtle'];
|
app.keys = ['im a newer secret', 'i like turtle'];
|
||||||
app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256');
|
app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256');
|
||||||
```
|
```
|
||||||
|
@ -101,14 +103,14 @@ app.on('error', function(err){
|
||||||
If an error in the req/res cycle and it is _not_ possible to respond to the client, the `Context` instance is also passed:
|
If an error in the req/res cycle and it is _not_ possible to respond to the client, the `Context` instance is also passed:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
app.on('error', function(err){
|
app.on('error', function(err, ctx){
|
||||||
log.error('server error', err);
|
log.error('server error', err, ctx);
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
When an error occurs _and_ it is still possible to respond to the client, aka no data has been written to the socket, Koa will respond
|
When an error occurs _and_ it is still possible to respond to the client, aka no data has been written to the socket, Koa will respond
|
||||||
appropriately with a 500 "Internal Server Error". In either case
|
appropriately with a 500 "Internal Server Error". In either case
|
||||||
an app-level "error" is emitted for logging purposes.
|
an app-level "error" is emitted for logging purposes.
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
|
@ -118,7 +120,12 @@ app.on('error', function(err){
|
||||||
however expensive requests would benefit from custom handling. For
|
however expensive requests would benefit from custom handling. For
|
||||||
example instead of reading a file into memory and piping it to the
|
example instead of reading a file into memory and piping it to the
|
||||||
client, you may wish to `stat()` and set the `Content-*` header fields
|
client, you may wish to `stat()` and set the `Content-*` header fields
|
||||||
appropriately to bypass the read.
|
appropriately to bypass the read.
|
||||||
|
|
||||||
|
On a valid __HEAD__ request, you should either set the status code
|
||||||
|
to anything but `200` or set `this.body = ''`,
|
||||||
|
otherwise koa will not consider the request "handled" and instead
|
||||||
|
respond with a 404.
|
||||||
|
|
||||||
### Socket Errors
|
### Socket Errors
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
### req.length
|
### req.length
|
||||||
|
|
||||||
Return request Content-Length as a number when present, or undefined.
|
Return request Content-Length as a number when present, or `undefined`.
|
||||||
|
|
||||||
### req.type
|
### req.type
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
```js
|
```js
|
||||||
var ct = this.type;
|
var ct = this.type;
|
||||||
// => "image/png"
|
// => "image/png"
|
||||||
```
|
```
|
||||||
|
|
||||||
### req.url
|
### req.url
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ var ct = this.type;
|
||||||
Set request pathname and retain query-string when present.
|
Set request pathname and retain query-string when present.
|
||||||
|
|
||||||
### req.query
|
### req.query
|
||||||
|
|
||||||
Get parsed query-string, returning an empty object when no
|
Get parsed query-string, returning an empty object when no
|
||||||
query-string is present. Note that this getter does _not_
|
query-string is present. Note that this getter does _not_
|
||||||
support nested parsing.
|
support nested parsing.
|
||||||
|
@ -81,6 +81,14 @@ this.query = { next: '/login' };
|
||||||
|
|
||||||
Set raw query string.
|
Set raw query string.
|
||||||
|
|
||||||
|
### req.search
|
||||||
|
|
||||||
|
Get raw query string with the `?`.
|
||||||
|
|
||||||
|
### req.search=
|
||||||
|
|
||||||
|
Set raw query string.
|
||||||
|
|
||||||
### req.host
|
### req.host
|
||||||
|
|
||||||
Get host void of port number when present. Supports `X-Forwarded-Host`
|
Get host void of port number when present. Supports `X-Forwarded-Host`
|
||||||
|
@ -98,7 +106,7 @@ this.set('ETag', '123');
|
||||||
if (this.fresh) {
|
if (this.fresh) {
|
||||||
this.status = 304;
|
this.status = 304;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// cache is stale
|
// cache is stale
|
||||||
// fetch new data
|
// fetch new data
|
||||||
|
@ -133,21 +141,21 @@ this.body = yield db.find('something');
|
||||||
### req.subdomains
|
### req.subdomains
|
||||||
|
|
||||||
Return subdomains as an array.
|
Return subdomains as an array.
|
||||||
|
|
||||||
Subdomains are the dot-separated parts of the host before the main domain of
|
Subdomains are the dot-separated parts of the host before the main domain of
|
||||||
the app. By default, the domain of the app is assumed to be the last two
|
the app. By default, the domain of the app is assumed to be the last two
|
||||||
parts of the host. This can be changed by setting `app.subdomainOffset`.
|
parts of the host. This can be changed by setting `app.subdomainOffset`.
|
||||||
|
|
||||||
For example, if the domain is "tobi.ferrets.example.com":
|
For example, if the domain is "tobi.ferrets.example.com":
|
||||||
If `app.subdomainOffset` is not set, this.subdomains is `["ferrets", "tobi"]`.
|
If `app.subdomainOffset` is not set, this.subdomains is `["ferrets", "tobi"]`.
|
||||||
If `app.subdomainOffset` is 3, this.subdomains is `["tobi"]`.
|
If `app.subdomainOffset` is 3, this.subdomains is `["tobi"]`.
|
||||||
|
|
||||||
### req.is(type)
|
### req.is(type)
|
||||||
|
|
||||||
Check if the incoming request contains the `Content-Type`
|
Check if the incoming request contains the `Content-Type`
|
||||||
header field, and it contains the give mime `type`.
|
header field, and it contains the give mime `type`.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// With Content-Type: text/html; charset=utf-8
|
// With Content-Type: text/html; charset=utf-8
|
||||||
this.is('html');
|
this.is('html');
|
||||||
this.is('.html');
|
this.is('.html');
|
||||||
|
@ -171,12 +179,12 @@ this.is('html');
|
||||||
Check if the given `type(s)` is acceptable, returning
|
Check if the given `type(s)` is acceptable, returning
|
||||||
the best match when true, otherwise `undefined`, in which
|
the best match when true, otherwise `undefined`, in which
|
||||||
case you should respond with 406 "Not Acceptable".
|
case you should respond with 406 "Not Acceptable".
|
||||||
|
|
||||||
The `type` value may be one or more mime type string
|
The `type` value may be one or more mime type string
|
||||||
such as "application/json", the extension name
|
such as "application/json", the extension name
|
||||||
such as "json", or an array `["json", "html", "text/plain"]`. When a list or array is given the _best_ match, if any is returned.
|
such as "json", or an array `["json", "html", "text/plain"]`. When a list or array is given the _best_ match, if any is returned.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// Accept: text/html
|
// Accept: text/html
|
||||||
this.accepts('html');
|
this.accepts('html');
|
||||||
// => "html"
|
// => "html"
|
||||||
|
@ -282,28 +290,3 @@ this.acceptsLanguages();
|
||||||
// => ["es", "pt", "en"]
|
// => ["es", "pt", "en"]
|
||||||
```
|
```
|
||||||
|
|
||||||
### req.error(msg, [status])
|
|
||||||
|
|
||||||
Helper method to throw an error with a `.status` property
|
|
||||||
that will allow Koa to respond appropriately. The following
|
|
||||||
combinations are allowed:
|
|
||||||
|
|
||||||
```js
|
|
||||||
this.error(403)
|
|
||||||
this.error('name required', 400)
|
|
||||||
this.error('something exploded')
|
|
||||||
```
|
|
||||||
|
|
||||||
For example `this.error('name required', 400)` is requivalent to:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var err = new Error('name required');
|
|
||||||
err.status = 400;
|
|
||||||
throw err;
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that these are user-level errors and are flagged with
|
|
||||||
`err.expose` meaning the messages are appropriate for
|
|
||||||
client responses, which is typically not the case for
|
|
||||||
error messages since you do not want to leak failure
|
|
||||||
details.
|
|
||||||
|
|
|
@ -87,7 +87,7 @@
|
||||||
### res.length
|
### res.length
|
||||||
|
|
||||||
Return response Content-Length as a number when present, or deduce
|
Return response Content-Length as a number when present, or deduce
|
||||||
from `res.body` when possible, or undefined.
|
from `res.body` when possible, or `undefined`.
|
||||||
|
|
||||||
### res.body
|
### res.body
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ this.set({
|
||||||
```js
|
```js
|
||||||
var ct = this.type;
|
var ct = this.type;
|
||||||
// => "image/png"
|
// => "image/png"
|
||||||
```
|
```
|
||||||
|
|
||||||
### res.type=
|
### res.type=
|
||||||
|
|
||||||
|
@ -186,13 +186,13 @@ this.type = 'png';
|
||||||
|
|
||||||
### res.redirect(url, [alt])
|
### res.redirect(url, [alt])
|
||||||
|
|
||||||
Perform a 302 redirect to `url`.
|
Perform a [302] redirect to `url`.
|
||||||
|
|
||||||
The string "back" is special-cased
|
The string "back" is special-cased
|
||||||
to provide Referrer support, when Referrer
|
to provide Referrer support, when Referrer
|
||||||
is not present `alt` or "/" is used.
|
is not present `alt` or "/" is used.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
this.redirect('back');
|
this.redirect('back');
|
||||||
this.redirect('back', '/index.html');
|
this.redirect('back', '/index.html');
|
||||||
this.redirect('/login');
|
this.redirect('/login');
|
||||||
|
@ -200,11 +200,11 @@ this.redirect('http://google.com');
|
||||||
```
|
```
|
||||||
|
|
||||||
To alter the default status of `302` or the response
|
To alter the default status of `302` or the response
|
||||||
body simply re-assign after this call:
|
body simply assign before and re-assign after this call:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
this.redirect('/cart');
|
|
||||||
this.status = 301;
|
this.status = 301;
|
||||||
|
this.redirect('/cart');
|
||||||
this.body = 'Redirecting to shopping cart';
|
this.body = 'Redirecting to shopping cart';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -219,3 +219,24 @@ this.body = 'Redirecting to shopping cart';
|
||||||
Check if a response header has already been sent. Useful for seeing
|
Check if a response header has already been sent. Useful for seeing
|
||||||
if the client may be notified on error.
|
if the client may be notified on error.
|
||||||
|
|
||||||
|
### res.lastModified
|
||||||
|
|
||||||
|
Return the `Last-Modified` header as a `Date`, if it exists.
|
||||||
|
|
||||||
|
### res.lastModified=
|
||||||
|
|
||||||
|
Set the `Last-Modified` header as an appropriate UTC string.
|
||||||
|
You can either set it as a `Date` or date string.
|
||||||
|
|
||||||
|
```js
|
||||||
|
this.response.lastModified = new Date();
|
||||||
|
```
|
||||||
|
|
||||||
|
### res.etag=
|
||||||
|
|
||||||
|
Set the ETag of a response including the wrapped `"`s.
|
||||||
|
Note that there is no corresponding `res.etag` getter.
|
||||||
|
|
||||||
|
```js
|
||||||
|
this.response.etag = crypto.createHash('md5').update(this.body).digest('hex');
|
||||||
|
```
|
Loading…
Reference in a new issue