包详细信息

@eggjs/koa

eggjs1.3kMIT2.22.1

Koa web app framework for https://eggjs.org

web, app, http, application

自述文件

@eggjs/koa

@eggjs/koa is forked from Koa v2.x for LTS and drop Node.js < 18.19.0 support.

Koa middleware framework for nodejs

NPM version NPM download Node.js CI Test coverage Known Vulnerabilities

Expressive HTTP middleware framework for node.js to make web applications and APIs more enjoyable to write. Koa's middleware stack flows in a stack-like manner, allowing you to perform actions downstream then filter and manipulate the response upstream.

Only methods that are common to nearly all HTTP servers are integrated directly into Koa's small codebase. This includes things like content negotiation, normalization of node inconsistencies, redirection, and a few others.

Koa is not bundled with any middleware.

Installation

@eggjs/koa requires node v18.19.0 or higher for Node.js LTS support.

npm install @eggjs/koa

Hello Koa

import { Application } from '@eggjs/koa';

const app = new Application();

// response
app.use(ctx => {
  ctx.body = 'Hello Koa';
});

app.listen(3000);

Getting started

  • Kick-Off-Koa - An intro to Koa via a set of self-guided workshops.
  • Workshop - A workshop to learn the basics of Koa, Express' spiritual successor.
  • Introduction Screencast - An introduction to installing and getting started with Koa

Middleware

Koa is a middleware framework that can take two different kinds of functions as middleware:

  • async function
  • common function

Here is an example of logger middleware with each of the different functions:

async functions

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

Common function

// Middleware normally takes two parameters (ctx, next), ctx is the context for one request,
// next is a function that is invoked to execute the downstream middleware. It returns a Promise with a then function for running code after completion.

app.use((ctx, next) => {
  const start = Date.now();
  return next().then(() => {
    const ms = Date.now() - start;
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
  });
});

Context, Request and Response

Each middleware receives a Koa Context object that encapsulates an incoming http message and the corresponding response to that message. ctx is often used as the parameter name for the context object.

app.use(async (ctx, next) => {
  await next();
});

Koa provides a Request object as the request property of the Context.
Koa's Request object provides helpful methods for working with http requests which delegate to an IncomingMessage from the node http module.

Here is an example of checking that a requesting client supports xml.

app.use(async (ctx, next) => {
  ctx.assert(ctx.request.accepts('xml'), 406);
  // equivalent to:
  // if (!ctx.request.accepts('xml')) ctx.throw(406);
  await next();
});

Koa provides a Response object as the response property of the Context.
Koa's Response object provides helpful methods for working with http responses which delegate to a ServerResponse .

Koa's pattern of delegating to Node's request and response objects rather than extending them provides a cleaner interface and reduces conflicts between different middleware and with Node itself as well as providing better support for stream handling. The IncomingMessage can still be directly accessed as the req property on the Context and ServerResponse can be directly accessed as the res property on the Context.

Here is an example using Koa's Response object to stream a file as the response body.

app.use(async (ctx, next) => {
  await next();
  ctx.response.type = 'xml';
  ctx.response.body = fs.createReadStream('really_large.xml');
});

The Context object also provides shortcuts for methods on its request and response. In the prior examples, ctx.type can be used instead of ctx.response.type and ctx.accepts can be used instead of ctx.request.accepts.

For more information on Request, Response and Context, see the Request API Reference, Response API Reference and Context API Reference.

Koa Application

The object created when executing new Koa() is known as the Koa application object.

The application object is Koa's interface with node's http server and handles the registration of middleware, dispatching to the middleware from http, default error handling, as well as configuration of the context, request and response objects.

Learn more about the application object in the Application API Reference.

Documentation

Troubleshooting

Check the Troubleshooting Guide or Debugging Koa in the general Koa guide.

Running tests

npm test

Reporting vulnerabilities

To report a security vulnerability, please do not open an issue, as this notifies attackers of the vulnerability. Instead, please email fengmk2 to disclose.

Community

License

MIT

Contributors

Contributors

Made with contributors-img.

更新日志

Changelog

2.22.1 (2025-04-08)

Bug Fixes

  • don't render redirect values in anchor ref (8af1bed)

2.22.0 (2025-03-25)

Features

2.21.0 (2025-03-13)

Features

2.20.7 (2025-02-12)

Bug Fixes

  • avoid redos on host and protocol getter (#17) (cd6b487)

2.20.6 (2025-01-02)

Bug Fixes

  • remove template on use MiddlewareFunc (f4315d9)

2.20.5 (2025-01-02)

Bug Fixes

2.20.4 (2025-01-02)

Bug Fixes

2.20.3 (2025-01-02)

Bug Fixes

2.20.2 (2024-12-19)

Bug Fixes

  • make Context state property can be override by Sub Class (#14) (49abe7f)

2.20.1 (2024-12-19)

Bug Fixes

  • let MiddlewareFunc can extend by custom Context interface (#13) (320fbf5)

2.20.0 (2024-12-18)

Features

  • allow to set symbol property on request, response, context and app (#12) (5e18ed2)

2.19.2 (2024-12-11)

Bug Fixes

  • allow delegate access request property (#11) (2967724)

2.19.1 (2024-07-07)

Bug Fixes

  • change keys to getter and setter (e0dc2a0)

2.19.0 (2024-07-07)

Features

  • emit request and response event on app (d5f08b4)

2.18.5 (2024-07-07)

Bug Fixes

  • export handleRequest on application (#10) (dfda217)

2.18.4 (2024-06-30)

Bug Fixes

  • change env and proxy to getter and setter (#9) (14aa2c5)

2.18.3 (2024-06-16)

Bug Fixes

  • change debug prefix to @eggjs/koa (#8) (c5e4cc5)

2.18.2 (2024-06-15)

Bug Fixes

  • should export ContextDelegation and Context both (#7) (b26b549)

2.18.1 (2024-06-11)

Bug Fixes

2.18.0 (2024-06-08)

Features

2.17.0 (2024-03-15)

Features

  • formatting redirect url on http(s) protocol url (#4) (7e7fcd1)

2.16.0 (2023-12-19)

Features

2.15.1 (2023-06-04)

Bug Fixes

  • change types.d.ts to types.ts (#2) (7101f87)

2.15.0 (2023-06-04)

Features

2.14.2 / 2023-04-12

fixes

2.14.1 / 2022-12-07

fixes

  • [cb92bc9] - fix: should export createAsyncCtxStorageMiddleware function on application (#1724) (fengmk2 <fengmk2@gmail.com>)

2.14.0 / 2022-12-06

features

2.13.4 / 2021-10-19

fixes

2.13.3 / 2021-09-24

fixes

2.13.2 / 2021-09-24

fixes

others

2.13.1 / 2021-01-04

fixes

others

2.13.0 / 2020-06-21

features

others

2.12.1 / 2020-06-13

fixes

others

2.12.0 / 2020-05-18

features

others

2.11.0 / 2019-10-28

features

others

2.10.0 / 2019-10-12

features

2.9.0 / 2019-10-12

features

others

2.8.2 / 2019-09-28

fixes

others

2.8.1 / 2019-08-19

fixes

2.8.0 / 2019-08-19

features

fixes

others

2.7.0 / 2019-01-28

features

others

2.6.2 / 2018-11-10

fixes

others

2.6.1 / 2018-10-23

fixes

2.6.0 / 2018-10-23

features

  • [9c5c58b] - feat: use :authority header of http2 requests as host (#1262) (Martin Michaelis <code@mgjm.de>)
  • [9146024] - feat: response.attachment append a parameter: options from contentDisposition (#1240) (小雷 <863837949@qq.com>)

others

2.5.3 / 2018-09-11

fixes

others

2.5.2 / 2018-07-12

  • deps: upgrade all dependencies
  • perf: avoid stringify when set header (#1220)
  • perf: cache content type's result (#1218)
  • perf: lazy init cookies and ip when first time use it (#1216)
  • chore: fix comment & approve cov (#1214)
  • docs: fix grammar
  • test&cov: add test case (#1211)
  • Lazily initialize request.accept and delegate context.accept (#1209)
  • fix: use non deprecated custom inspect (#1198)
  • Simplify processes in the getter request.protocol (#1203)
  • docs: better demonstrate middleware flow (#1195)
  • fix: Throw a TypeError instead of a AssertionError (#1199)
  • chore: mistake in a comment (#1201)
  • chore: use this.res.socket insteadof this.ctx.req.socket (#1177)
  • chore: Using "listenerCount" instead of "listeners" (#1184)

2.5.1 / 2018-04-27

  • test: node v10 on travis (#1182)
  • fix tests: remove unnecessary assert doesNotThrow and api calls (#1170)
  • use this.response insteadof this.ctx.response (#1163)
  • deps: remove istanbul (#1151)
  • Update guide.md (#1150)

2.5.0 / 2018-02-11

  • feat: ignore set header/status when header sent (#1137)
  • run coverage using --runInBand (#1141)
  • [Update] license year to 2018 (#1130)
  • docs: small grammatical fix in api docs index (#1111)
  • docs: fixed typo (#1112)
  • docs: capitalize K in word koa (#1126)
  • Error handling: on non-error throw try to stringify if error is an object (#1113)
  • Use eslint-config-koa (#1105)
  • Update mgol's name in AUTHORS, add .mailmap (#1100)
  • Avoid generating package locks instead of ignoring them (#1108)
  • chore: update copyright year to 2017 (#1095)

2.4.1 / 2017-11-06

  • fix bad merge w/ 2.4.0

2.4.0 / 2017-11-06

UNPUBLISHED

  • update package.engines.node to be more strict
  • update fresh@^0.5.2
  • fix: inspect() no longer crashes context
  • fix: gated res.statusMessage for HTTP/2
  • added: app.handleRequest() is exposed

2.3.0 / 2017-06-20

  • fix: use Buffer.from()
  • test on node 7 & 8
  • add package-lock.json to .gitignore
  • run lint --fix
  • add request.header in addition to request.headers
  • add IPv6 hostname support

2.2.0 / 2017-03-14

  • fix: drop package.engines.node requirement to >= 6.0.0
    • this fixes yarn, which errors when this semver range is not satisfied
  • bump cookies@~0.7.0
  • bump fresh@^0.5.0

2.1.0 / 2017-03-07

  • added: return middleware chain promise from callback() #848
  • added: node v7.7+ res.getHeaderNames() support #930
  • added: err.headerSent in error handling #919
  • added: lots of docs!

2.0.1 / 2017-02-25

NOTE: we hit a versioning snafu. v2.0.0 was previously released, so v2.0.1 is released as the first v2.x with a latest tag.

  • upgrade mocha #900
  • add names to application's request and response handlers #805
  • breaking: remove unused app.name #899
  • breaking: drop official support for node < 7.6

2.0.0 / ??????????

  • Fix malformed content-type header causing exception on charset get (#898)
  • fix: subdomains should be [] if the host is an ip (#808)
  • don't pre-bound onerror [breaking change] (#800)
  • fix ctx.flushHeaders() to use res.flushHeaders() instead of res.writeHead() (#795)
  • fix(response): correct response.writable logic (#782)
  • merge v1.1.2 and v1.2.0 changes
  • include koa-convert so that generator functions still work
    • NOTE: generator functions are deprecated in v2 and will be removed in v3
  • improve linting
  • improve docs

2.0.0-alpha.8 / 2017-02-13

  • Fix malformed content-type header causing exception on charset get (#898)

2.0.0-alpha.7 / 2016-09-07

  • fix: subdomains should be [] if the host is an ip (#808)

2.0.0-alpha.6 / 2016-08-29

  • don't pre-bound onerror [breaking change]

2.0.0-alpha.5 / 2016-08-10

  • fix ctx.flushHeaders() to use res.flushHeaders() instead of res.writeHead()

2.0.0-alpha.4 / 2016-07-23

  • fix response.writeable during pipelined requests

1.2.0 / 2016-03-03

1.1.2 / 2015-11-05

  • ensure parseurl always working as expected
  • fix Application.inspect() – missing .proxy value.

2.0.0-alpha.3 / 2015-11-05

  • ensure parseurl always working as expected. #586
  • fix Application.inspect() – missing .proxy value. Closes #563

2.0.0-alpha.2 / 2015-10-27

  • remove co and generator support completely
  • improved documentation
  • more refactoring into ES6

2.0.0-alpha.1 / 2015-10-22

  • change the middleware signature to async (ctx, next) => await next()
  • drop node < 4 support and rewrite the codebase in ES6

1.1.1 / 2015-10-22

  • do not send a content-type when the type is unknown #536

1.1.0 / 2015-10-11

  • add app.silent=<Boolean> to toggle error logging @tejasmanohar #486
  • add ctx.origin @chentsulin #480
  • various refactoring
    • add use strict everywhere

1.0.0 / 2015-08-22

  • add this.req check for querystring()
  • don't log errors with err.expose
  • koa now follows semver!

0.21.0 / 2015-05-23

  • empty request.query objects are now always the same instance
  • bump fresh@0.3.0

0.20.0 / 2015-04-30

Breaking change if you're using this.get('ua') === undefined etc. For more details please checkout #438.

  • make sure helpers return strict string
  • feat: alias response.headers to response.header

0.19.1 / 2015-04-14

  • non-error thrown, fixed #432

0.19.0 / 2015-04-05

  • req.host and req.hostname now always return a string (semi-breaking change)
  • improved test coverage

0.18.1 / 2015-03-01

  • move babel to devDependencies

0.18.0 / 2015-02-14

  • experimental es7 async function support via app.experimental = true
  • use content-type instead of media-typer

0.17.0 / 2015-02-05

Breaking change if you're using an old version of node v0.11! Otherwise, you should have no trouble upgrading.

  • official iojs support
  • drop support for node.js >= 0.11.0 < 0.11.16
  • use Object.setPrototypeOf() instead of __proto__
  • update dependencies

0.16.0 / 2015-01-27

  • add res.append()
  • fix path usage for node@0.11.15

0.15.0 / 2015-01-18

  • add this.href

0.14.0 / 2014-12-15

  • remove x-powered-by response header
  • fix the content type on plain-text redirects
  • add ctx.state
  • bump co@4
  • bump dependencies

0.13.0 / 2014-10-17

  • add this.message
  • custom status support via statuses

0.12.2 / 2014-09-28

  • use wider semver ranges for dependencies koa maintainers also maintain

0.12.1 / 2014-09-21

  • bump content-disposition
  • bump statuses

0.12.0 / 2014-09-20

  • add this.assert()
  • use content-disposition

0.11.0 / 2014-09-08

  • fix app.use() assertion #337
  • bump a lot of dependencies

0.10.0 / 2014-08-12

  • add ctx.throw(err, object) support
  • add ctx.throw(err, status, object) support

0.9.0 / 2014-08-07

  • add: do not set err.expose to true when err.status not a valid http status code
  • add: alias request.headers as request.header
  • add context.inspect(), cleanup app.inspect()
  • update cookies
  • fix err.status invalid lead to uncaughtException
  • fix middleware gif, close #322

0.8.2 / 2014-07-27

  • bump co
  • bump parseurl

0.8.1 / 2014-06-24

  • bump type-is

0.8.0 / 2014-06-13

  • add `this.response.is()``
  • remove .status=string and res.statusString #298

0.7.0 / 2014-06-07

  • add this.lastModified and this.etag as both getters and setters for ubiquity #292. See koajs/koa@4065bf7 for an explanation.
  • refactor this.response.vary() to use vary #291
  • remove this.response.append() #291

0.6.3 / 2014-06-06

  • fix res.type= when the extension is unknown
  • assert when non-error is passed to app.onerror #287
  • bump finished

0.6.2 / 2014-06-03

  • switch from set-type to mime-types

0.6.1 / 2014-05-11

  • bump type-is
  • bump koa-compose

0.6.0 / 2014-05-01

  • add nicer error formatting
  • add: assert object type in ctx.onerror
  • change .status default to 404. Closes #263
  • remove .outputErrors, suppress output when handled by the dev. Closes #272
  • fix content-length when body is re-assigned. Closes #267

0.5.5 / 2014-04-14

  • fix length when .body is missing
  • fix: make sure all intermediate stream bodies will be destroyed

0.5.4 / 2014-04-12

  • fix header stripping in a few cases

0.5.3 / 2014-04-09

  • change res.type= to always default charset. Closes #252
  • remove ctx.inspect() implementation. Closes #164

0.5.2 / 2014-03-23

  • fix: inspection of app and app.toJSON()
  • fix: let this.thrown errors provide their own status
  • fix: overwriting of content-type w/ HEAD requests
  • refactor: use statuses
  • refactor: use escape-html
  • bump dev deps

0.5.1 / 2014-03-06

  • add request.hostname(getter). Closes #224
  • remove response.charset and ctx.charset (too confusing in relation to ctx.type) [breaking change]
  • fix a debug() name

0.5.0 / 2014-02-19

  • add context.charset
  • add context.charset=
  • add request.charset
  • add response.charset
  • add response.charset=
  • fix response.body= html content sniffing
  • change ctx.length and ctx.type to always delegate to response object [breaking change]

0.4.0 / 2014-02-11

  • remove app.jsonSpaces settings - moved to koa-json
  • add this.response=false to bypass koa's response handling
  • fix response handling after body has been sent
  • changed ctx.throw() to no longer .expose 5xx errors
  • remove app.keys getter/setter, update cookies, and remove keygrip deps
  • update fresh
  • update koa-compose

0.3.0 / 2014-01-17

  • add ctx.host= delegate
  • add req.host=
  • add: context.throw supports Error instances
  • update co
  • update cookies

0.2.1 / 2013-12-30

  • add better 404 handling
  • add check for fn._name in debug() output
  • add explicit .toJSON() calls to ctx.toJSON()

0.2.0 / 2013-12-28

  • add support for .throw(status, msg). Closes #130
  • add GeneratorFunction assertion for app.use(). Closes #120
  • refactor: move .is() to type-is
  • refactor: move content negotiation to "accepts"
  • refactor: allow any streams with .pipe method
  • remove next in callback for now

0.1.2 / 2013-12-21

  • update co, koa-compose, keygrip
  • use on-socket-error
  • add throw(status, msg) support
  • assert middleware is GeneratorFunction
  • ducktype stream checks
  • remove next is app.callback()

0.1.1 / 2013-12-19

  • fix: cleanup socker error handler on response