一个 Koa 应用程序可以使用另一个 Koa 应用程序吗?

Can a Koa Application Use Another Koa Application?

如问题所示,我在使用一个 koa 应用程序作为另一个应用程序的中间件时遇到了问题。使用 express,我们可以这样做:

const express = require('express');
const expressApp = express();
const otherExpressApp = express();

app.use(otherExpressApp);

同样的模式适用于 connect。但是,它不适用于 koa:

const koa = require(`koa`);
const koaApp = koa();
const otherKoaApp = koa();

app.use(otherKoaApp);

给我:

AssertionError: app.use() requires a generator function
    at Application.app.use (/home/sean/repos/koaka/node_modules/koa/lib/application.js:100:5)
    at repl:1:5
    at REPLServer.defaultEval (repl.js:164:27)
    at bound (domain.js:250:14)
    at REPLServer.runBound [as eval] (domain.js:263:12)
    at REPLServer.<anonymous> (repl.js:392:12)
    at emitOne (events.js:82:20)
    at REPLServer.emit (events.js:169:7)
    at REPLServer.Interface._onLine (readline.js:210:10)
    at REPLServer.Interface._line (readline.js:546:8)

koa 提供了一个函数,可以将其安装为 express/connect 应用程序:

expressApp.use(koaApp.callback());

但这似乎不适用于 koa 本身:

koaApp.use(otherKoaApp.callback());

投掷:

AssertionError: app.use() requires a generator function
    at Application.app.use (/home/sean/repos/koaka/node_modules/koa/lib/application.js:100:5)
    at repl:1:7
    at REPLServer.defaultEval (repl.js:164:27)
    at bound (domain.js:250:14)
    at REPLServer.runBound [as eval] (domain.js:263:12)
    at REPLServer.<anonymous> (repl.js:392:12)
    at emitOne (events.js:82:20)
    at REPLServer.emit (events.js:169:7)
    at REPLServer.Interface._onLine (readline.js:210:10)
    at REPLServer.Interface._line (readline.js:546:8)

我可以使用一个 koa 应用程序作为另一个 koa 应用程序的中间件吗? 如果可以,怎么做?如果不是,是否打算将此行为放入将来的版本中?为什么或为什么不?

执行此操作的方法是使用 koa-mount

https://github.com/koajs/mount

var koa = require('koa');
var mount = require('koa-mount');
var app1 = koa();
var app2 = koa();
app1.use(mount(app2));

或者将其安装在 URL 子路径下:

app1.use(mount('/api', app2));

koa 与 express 的不同之处在于它有一个非常小的内核。例如,express 附带静态 webserver 中间件,但 koa 没有。您需要导入一个单独的模块来执行 "X" 的事实就是 koa 中的工作方式。但是请注意,koa-mount 仍在旗舰 koajs github 回购下,所以它或多或少是官方的。