docs: add res.lastModified and res.etag among other things

This commit is contained in:
Jonathan Ong 2013-11-19 22:40:52 -08:00
parent 1dd1d02db0
commit dc873d66e2
4 changed files with 75 additions and 61 deletions

View file

@ -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.

View file

@ -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

View file

@ -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.

View file

@ -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');
```