Обработчик запросов не может отобразить представление с помощью плагина Vision - PullRequest
0 голосов
/ 25 марта 2019

Я работаю над API HapiJS, и я определил плагин, который регистрирует плагин Vision и настраивает механизм рендеринга (ejs).Но когда я пытаюсь ответить на запрос, отображая представление, я получаю сообщение об ошибке

AssertionError [ERR_ASSERTION]: Менеджер отсутствующих представлений

Если я регистрирую плагин Vision иего конфигурация где-то вне плагина, тесты проходят, но я ожидаю, что я смогу заключить эту логику в плагин.

// plugin
const ejs = require('ejs');
const Vision = require('vision');

module.exports = {
    name: 'views',
    version: '0.0.1',
    register: async (server, { path }) => {
        await server.register(Vision);
        server.views({
            engines: { ejs },
            path,
        });
    },
};

Код обработчика

// api
server.route({
  path: '/korin/songs',
  method: 'GET',
  handler: async (request, h) => {
    try {
      const acceptType = getMediaType(request.headers.accept);
      const data = await server.methods.getTopTracks({
        getTopTracks,
        lastfmApi,
      });
      if (acceptType === 'text/html') {
        return h.view('index'); // <-- this errors
      }
      return data;
    } catch (error) {
      console.warn(error);
    }
  },
});

Ошибкагенерируется ошибочным тестом

suite('render content', () => {
    test.only(`given text/html page should respond with header and footer`, async () => {
        const { server } = await setup();
        const { payload } = await server.inject({
            method: 'GET',
            url: '/korin/songs',
            headers: {
                accept: 'text/html',
            },
        });

        expect(payload).to.contain(`<header>`);
        expect(payload).to.contain(`<footer>`);
    });
});
// test setup
const setup = async options => {
    const server = new Hapi.Server();

    // truncated for brevity
    await server.register({
        plugin: require('../../server/api'),
        options: {
            ...defaults,
            ...options,
        },
    });

    await server.register({
        plugin: require('../../server/views'),
        options: { path: path.join(__dirname, '../views/templates') },
    });

    return {
        server
    };
};

Что-то я пропускаю?Я попытался запустить console.log, и кажется, что код работает в правильном порядке, но все равно не работает.

1 Ответ

1 голос
/ 10 апреля 2019

На GitHub есть старая ветка по этому поводу.TL; DR: ссылка на server, переданная плагину при регистрации, немного не совпадает с "root" server.Некоторая разница в сферах , по-видимому, все еще проблема.

Действительно: в плагине, server.getViewsManager() (украшенный vision) после регистрации vision и server.views покажетчто-то, тогда как тот же вызов в вашем маршруте (так, после регистрации плагина) покажет null.Вот вам и «ссылки».

Я только что попробовал подобную вам структуру, получил ту же ошибку, и этот поток указал мне на обходной путь: при регистрации вашего плагина views просто передайте ссылку на"реальный" server в опциях.

// plugin
const ejs = require('ejs');
const Vision = require('vision');

module.exports = {
    name: 'views',
    version: '0.0.1',
    register: async (server, { path, realServer }) => { // <= added option
        await realServer.register(Vision); // <= replaced server w/ realServer
        realServer.views({ // <= replaced server w/ realServer
            engines: { ejs },
            path,
        });
    },
};
// test setup
// ...
    const server = new Hapi.Server();
    // ...
    await server.register({
        plugin: require('../../server/views'),
        options: {
            path: path.join(__dirname, '../views/templates'),
            realServer: server // <= added option
        }
    });

И, очевидно, у вас везде одни и те же опции.

...