Javascript 请求处理程序无法使用Vision插件呈现视图
我正在开发一个hapijsapi,我已经定义了一个插件来注册Vision插件并配置渲染引擎(ejs)。但是,当我尝试通过呈现视图来响应请求时,我得到了错误 AssertionError[ERR_ASSERTION]:缺少视图管理器 如果我在插件之外的某个地方注册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
// 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
}
});