2

我不知道为什么我会收到这个。我正在尝试在使用时创建一个简单的测试@hapi/crumb。我只在我的server.js.

const Path = require("path");
const hapi = require("hapi");
const inert = require("inert");
const vision = require("vision");
const Ejs = require("ejs");
const Crumb = require("@hapi/crumb");
const Blankie = require("blankie");
const Scooter = require("@hapi/scooter");
const routes = require("./routes");

// Configure the server
const server = hapi.Server({
  host: "0.0.0.0",
  port: process.env.PORT || 3000,
  routes: {
    files: {
      relativeTo: Path.join(__dirname, "..", "public")
    },
    state: {
      parse: true,
      failAction: "ignore"
    },
    security: {
      xframe: true,
      noOpen: false
    },
    cors: {
      origin: ["banglarelief.org"],
      headers: ["Authorization"], // an array of strings - 'Access-Control-Allow-Headers'
      exposedHeaders: ["Accept"], // an array of exposed headers - 'Access-Control-Expose-Headers',
      additionalExposedHeaders: ["Accept"], // an array of additional exposed headers
      maxAge: 60,
      credentials: true // boolean - 'Access-Control-Allow-Credentials'
    }
  }
});

const plugins = async () => {
  const pluginsToRegister = [
    inert,
    vision,
    require("hapi-mobile-views"),
    { plugin: Crumb, options: { cookieOptions: { isSecure: false } } },
    Scooter,
    {
      plugin: Blankie,
      options: {} // specify options here
    }
  ];
  await server.register(pluginsToRegister);
};

const init = async () => {
  await plugins();
  server.state("player", {
    ttl: null,
    clearInvalid: true,
    isSecure: false
  });
  server.views({
    engines: { ejs: Ejs },
    path: `${__dirname}/views`,
    layout: "layout"
  });
  await server.route(routes);
  return server;
};


const start = async () => {
  try {
    await init();
    await server.start();
  } catch (err) {
    console.log(err);
    process.exit(1);
  }
};

module.exports = { init, start };

我的测试文件非常基本,我试图在应该调用 start 的地方移动,但它一直抛出同样的错误。

'use strict';

const Lab = require('@hapi/lab');
const { expect } = require('@hapi/code');
const { afterEach, beforeEach, describe, it } = exports.lab = Lab.script();
const { init, start } = require('../src/server');

let server = start();

describe('GET /', () => {
    //let server;
    //server = start();

    beforeEach(async () => {
        //server = start();
    });

    afterEach(async () => {
        //await server.stop();
    });

    it('responds with 200', async () => {
        const res = await server.inject({
            method: 'get',
            url: '/'
        });
        expect(res.statusCode).to.equal(200);
    });
});

我一直在关注https://hapijs.com/tutorials/testing?lang=en_US

4

1 回答 1

0

plugins如果您将功能分成两部分,该解决方案似乎有效。一部分将初始化 3rd 方插件,例如@Hapi/*. 另一个函数将初始化您编写的第一方插件。您只会在您的start函数中初始化 3rd 方插件。

包括在内至关重要,{ once: true }因为这将防止您的错误。它只会初始化插件一次,这将防止您的错误。您不能总是{ once: true }在 3rd 方插件上指定。因此,我们必须以不同的方式处理它。由于我们将所有 3rd 方插件都移到了它们自己的函数中,该函数在启动时调用,这应该可以防止 3rd 方插件导致重新初始化的问题。

const hapiPlugins = async () => {
  const pluginsToRegister = [
    inert,
    vision,
    require("hapi-mobile-views"),
    { plugin: Crumb, options: { cookieOptions: { isSecure: false } } },
    Scooter,
    {
      plugin: Blankie,
      options: {} // specify options here
    }
  ];
};

const myPlugins = async () => {
  await server.register([
    allOfMyPlugins...
  ],
  {
    once: true  //critical so that you don't re-init your plugins
  });
};

const init = async () => {
  server.state("player", {
    ttl: null,
    clearInvalid: true,
    isSecure: false
  });
  server.views({
    engines: { ejs: Ejs },
    path: `${__dirname}/views`,
    layout: "layout"
  });
  await server.route(routes);
  return server;
};


const start = async () => {
  try {
    await hapiPlugins();
    await init();
    await server.start();
  } catch (err) {
    console.log(err);
    process.exit(1);
  }
};

然后,您应该能够调用init您的测试before函数。使用该服务器对象进行注入。

于 2019-07-18T13:52:10.883 回答