gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:57:49 25 4
gpt4 key购买 nike

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

我正在尝试设置一个 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 实例,即使 的记录值code>appapp1 是一样的({ 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 将因此始终返回 false。

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

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

关于javascript - 对象不是 "require"端的 Koa 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48380123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com