javascript - 如何使 Hapi 插件仅适用于特定域或子域?

标签 javascript node.js subdomain url-routing hapi.js

我的 Hapijs 项目中有以下内容:

API插件 前端插件

然后我有一个服务器文件夹,其中包含我的主 index.js 文件,Hapi 服务器在其中启动。我使用 Glue 插件将服务器文件夹中的所有内容链接在一起: https://www.npmjs.com/package/glue

我遇到的问题是我想为我的 api 使用子域,例如 api.locahost:8000 (api.domain.com)。但是,似乎无论我输入什么类型的子域,我都可以访问我的网站。

此外,就像 random.localhost:8000 转发到 locahost:8000 一样,我仍然可以访问我网站的所有页面。

这是我的代码:

'use strict';

const Dotenv = require('dotenv');
Dotenv.config({ path: `${__dirname}/.env` });
const Glue = require('glue');

const manifest = {
    server: {
        port: process.env.PORT,
        host: process.env.HOST
    },
    register: {
        plugins: [
            {
                plugin: '~/api',
                options: {
                    routes: {
                        vhost: process.env.SUBDOMAIN //api.localhost
                    }
                }
            },
            {
                plugin: '~/lib'
            }
        ],
        options: {
        }
    }
};

const options = {
    relativeTo: __dirname
};

const startServer = async function () {

    try {
        const server = await Glue.compose(manifest, options);
        await server.start();
        await console.log(`Server running at: ${server.info.uri}`);

    }
    catch (err) {
        console.error(err);
        process.exit(1);
    }
};

startServer();

如果您想知道“lib”是什么,那是我的前端目录名称。如果您查看 api 插件选项,您可以看到我添加子域的位置。

如何才能让我的前端插件仅使用 localhost:8000 而我的 API 插件仅使用 api.localhost:8000?它们需要是两个独立的服务器吗?

提前致谢。

最佳答案

我认为这是不可能的,但是您可以使用生命周期方法来访问当前路径和域,然后您可以在代码中插入某种逻辑来处理当前域。

例如,根据订单之前或之后的需求更改生命周期。

exports.plugin = {    
    register: async function (server, options) {
        server.ext('onPreHandler', async (request, h) => {
            if(request.info.host !== 'YOUR_DOMAIN') return h.continue;
            // you can check request.path also

            // rest of the code...


            return h.continue;
        })
    }
};

关于javascript - 如何使 Hapi 插件仅适用于特定域或子域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54735684/

相关文章:

javascript - 语法错误 : Unexpected Identifier in for-loop in AngularJS $http. 获取

javascript - 以编程方式安装 bower ?

google-app-engine - 如何将域路径指向我的 App Engine 应用程序?(不是子域)

google-cloud-platform - Google 管理的 SSL 证书卡在 Provisioning 上

authentication - 在同一域中的多个站点上进行单点登录

javascript - 了解异步 Javascript 代码

JavaScript 变量定义 : Commas vs. 分号

javascript - Cordova InAppBrowser 将表单发布到 url

javascript - 在同一进程中创建 "fresh and empty"Node.js JavaScript 上下文的最佳方法?

javascript - 从 AngularJS 访问我网站的 NodeJS Express API