问题:
Hapi不会将插件路由前缀传递给其已注册的子插件。
我做了什么
我有一些在某些主要插件中使用路由前缀注册的插件,如下所示:
const plugin: Hapi.Plugin<any> = {
name: 'public-api',
version: '1',
register: async (server: Hapi.Server, options: any) => {
await server.register([{
plugin: myPlugin,
routes: {
prefix: '/records'
}
}]);
}
}
现在,所有在“ myPlugin”中已注册的路由都将获得前缀“ records”。到目前为止很容易。
假设我在“ public-api”插件中注册了更多插件。
现在在我的主服务器对象中,我这样注册了“ public-api”插件本身(除了一些其他第三方插件):
await server.register([
...thirdPartyStuff,
{
plugin: publicApi,
routes: {
prefix: '/api'
},
}
]);
我的期望:
现在可以通过以下路径访问“记录”实体: / api / records
根据Hapi api文档的指定,已注册插件路由前缀将在其已注册子插件中传递或添加前缀。
参考:Hapi register plugins
现实:
服务器完全忽略“ publicApi”插件的前缀,并使“ myPlugin”在 / records
寻求帮助:
因此,我只是想念一些东西,或者我很愚蠢,无法正确阅读文档。
无论哪种方式,也许有人可以启发我,甚至给出解决方案
到我认为应该正常工作:D
因此,请提前阅读以任何方式阅读我的故事和您的帮助!
干杯!
答案 0 :(得分:0)
我已经阅读了docs from hapi,并根据您的信息和您提到的期望行为创建了一个有效的示例。
要运行它,只需在您的打字稿配置的项目目录中安装ts-node和hapi。
import { Server, Plugin, Request } from 'hapi';
const recordPlugin: Plugin<any> = {
name: 'my-plugin',
version: '1',
register: async (server: Server, options: any) => {
server.route({
method: 'GET',
path: '/records',
handler: async function(request: Request, h: any) {
return 'something';
}
});
}
};
const init = async () => {
const server = new Server({
port: 3000,
host: 'localhost'
});
await server.register({
plugin: recordPlugin,
routes: {
prefix: '/api'
}
});
await server.start();
console.log('Server running on %s', server.info.uri);
};
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit(1);
});
init();
尽管从我的角度来看,您的问题是如何为服务器导入和声明插件。
干杯!