对象不是 "require" 端的 Koa 实例

Object isn't an instance of Koa on the "require" side

这是一个奇怪的错误,所以我一定遗漏了一些明显的东西,但它就是。

我正在尝试设置一个 Koa 服务器,以根据虚拟主机名称为多个 Koa 应用程序提供服务。入口点是 server.js :

const _ = require("lodash");
const compose = require("koa-compose");
const Koa = require("koa");
const server = module.exports = new Koa();
const app1 = require("./apps/app1");
const app2 = require("./apps/app2");

console.log(app1 instanceof Koa); // false (!)
console.log(app1); // `{ subdomainOffset: 2, proxy: false, env: 'development' }`

const vhostApps = [
  { vhost: "localhost", app: composer(app1) }, // composer fails because app1 is not a Koa instance
  { vhost: "app1.mydomain.com", app: composer(app1) },
  { vhost: "app2.mydomain.com", app: composer(app2) }
];

server.use(async function(ctx, next) {
  const app = _(vhostApps).find({ vhost: ctx.hostname }).app;
  return await app ? app.apply(this, [ctx, next]) : next();
});

if (!module.parent) server.listen(process.env.PORT || 80);

function composer(app) {
  const middleware = app instanceof Koa ? app.middleware : app;
  return compose(middleware);
}

然后是./apps/app1/index.js,一个应用的入口点:

const Koa = require("koa");
const serve = require("koa-static");
const views = require("koa-views");
const router = require("./routes");

const app = new Koa();

app.use(serve(__dirname + "/assets"));
app.use(views(__dirname + "/views", { map: { html: "lodash" } }));
app.use(router.routes());

console.log(app instanceof Koa); // true (OK)
console.log(app); // `{ subdomainOffset: 2, proxy: false, env: 'development' }`

module.exports = app;

在这个模块中,app 是 Koa 的一个实例(因此它有一个 middleware 属性,数组类型)。

但是从server.js来看,从app1导入的值不是预期的Koa实例,即使[=15=的记录值]和app1是一样的({ subdomainOffset: 2, proxy: false, env: 'development' } ).

我做错了什么?

我想我终于找到了问题所在,而且,碰巧的是,我的问题中缺少重要的信息。

./apps/app1 文件夹有自己的 node_modules,有自己的 Koa 副本。因此,server.jsapps/app1/index.js 各有各的不同的 Koa。

所以我想在行中:const middleware = app instanceof Koa ? app.middleware : app;app instanceof Koa 总是 return false 因为这个原因。

一种解决方案是简单地从应用程序的 node_modules 中删除 Koa,因此 Koa 是从外部文件夹继承的。 (乍一看,它对我来说有一些缺点,因为我希望应用程序是独立的)。

但我想我会跳过 instanceof Koa 测试并用 const middleware = app.middleware; 代替(我从 https://github.com/koajs/examples/blob/master/vhost/app.js#L14 借用了原始行)。