对象不是 "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.js
和 apps/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 借用了原始行)。
这是一个奇怪的错误,所以我一定遗漏了一些明显的东西,但它就是。
我正在尝试设置一个 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.js
和 apps/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 借用了原始行)。