Javascript 请求处理程序无法使用Vision插件呈现视图

Javascript 请求处理程序无法使用Vision插件呈现视图,javascript,hapijs,hapijs-vision,Javascript,Hapijs,Hapijs Vision,我正在开发一个hapijsapi,我已经定义了一个插件来注册Vision插件并配置渲染引擎(ejs)。但是,当我尝试通过呈现视图来响应请求时,我得到了错误 AssertionError[ERR_ASSERTION]:缺少视图管理器 如果我在插件之外的某个地方注册Vision插件及其配置,测试就会通过,但我的期望是我应该能够将此逻辑封装在插件中 // plugin const ejs = require('ejs'); const Vision = require('vision'); modu

我正在开发一个hapijsapi,我已经定义了一个插件来注册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);
    }
  },
});

有什么我遗漏的吗?我试过运行一个console.log,代码似乎按正确的顺序运行,但还是失败了。

关于这一点,有一个解决方案。TL;DR:注册时传递给插件的
server
引用与“root”
server
略有不同。关于领域的一些差异,显然仍然是一个问题

事实上:在插件中,
server.getViewsManager()
(由
vision
修饰)在注册
vision
server.views
后将显示一些内容,而在路径中的相同调用(因此,在插件注册后)将显示
null
。“参考资料”到此为止

我刚刚尝试了一个与您类似的结构,得到了相同的错误,这个线程向我指出了一个解决方法:在注册
视图
插件时,只需在选项中传递对“real”
服务器
的引用

// 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,
        });
    },
};
//插件
const ejs=require('ejs');
const Vision=需要(“视觉”);
module.exports={
名称:'视图',
版本:“0.0.1”,

register:async(server,{path,realServer})=>{//谢谢,这很有意义。我注意到这也不起作用
sinon.spy(server,“register”)
。当我查看源代码时,我想我记得看到服务器被克隆或其他什么。您在哪个版本中使用了此代码块?我使用的是
18.1.0
版本,当我尝试使用它时,realServer param是未定义的@Petersorry-我现在不记得了-这是很久以前的事了,我已经对源代码进行了重大更改@硬体:/
// 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
    };
};

// 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
        }
    });