Node.js 多视图目录

Node.js 多视图目录,node.js,typescript,express,nestjs,Node.js,Typescript,Express,Nestjs,我正在使用nestJs框架开发一个MVC应用程序,我使用了hbs模板引擎 根据需要,我必须使用此配置使nestjs能够提供视图: async function bootstrap() { const app = await NestFactory.create(ApplicationModule); app.useStaticAssets(join(__dirname, '..', 'public')); app.setBaseViewsDir(join(__dirname, '.

我正在使用nestJs框架开发一个MVC应用程序,我使用了hbs模板引擎

根据需要,我必须使用此配置使nestjs能够提供视图:

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);

  app.useStaticAssets(join(__dirname, '..', 'public'));
  app.setBaseViewsDir(join(__dirname, '..', 'views'));
  app.setViewEngine('hbs');

  await app.listen(3000);
}
此配置假定所有视图都位于一个目录(视图)中,但如果每个模块都有自己的视图呢

从v5.7.0开始 您可以设置目录数组:

app.setBaseViewsDir([
  join(__dirname, '..', 'users/views'), 
  join(__dirname, '..', 'books/views'),
]);

v5.7.0之前 在express中,您可以:

应用程序视图的目录或目录数组。如果是数组,将按照视图在数组中出现的顺序查找视图

但是,nest.js中的键入不允许使用数组,请参阅。我已经创造了一个,这将改变这一点

在合并拉取请求之前,您可以执行以下操作:

app.setBaseViewsDir([
    join(__dirname, '..', 'users/views'), 
    join(__dirname, '..', 'books/views'),
  ] as any);

一旦合并拉取请求,您就可以像任何应用程序一样删除
,我假设您的应用程序结构与此类似:

src
  main.ts
  /users
       users.controller.ts
       /views
         my-view.hbs
  /books
       books.controller.ts
       /views
         my-view.hbs
然后可以将基本视图目录设置为
src

app.setBaseViewsDir(__dirname);
并在控制器中引用视图及其相对路径:

@Controller('users')
export class UsersController {

  @Render('users/views/my-view')
           ^^^^^^^^^^^^^^^^^^^
  @Get()
  async getMyView() {

谢谢它起作用了。但是通过这种方法,所有的“src”文件夹都将公开为公共文件夹,对吗?这安全吗?我认为只有当您设置
useStaticAssets
(您不必这样做)时,它才会暴露出来。只有当您通过
@Render
@maroodb显式公开视图时,才可以访问视图。这不是您的解决方案?但它不会公开任何文件,除非您在
@Render
中显式引用它们。即使您的视图目录位于src目录旁边,您也可以使用相对路径访问src目录中的视图:
。/src/my view
,但同样只能使用
@Render
。所以没有区别。对不起,这是一次意外的点击:piam无法实现这一点,无法查找view@SaurabhYadav这太笼统了,无法回答。请打开一个新问题并包含相关代码段。另外,请参见上面的另一个答案,也许这对您有用;所有的事情都和你在回答中提到的一样。我还为此创建了一个git回购协议,如果你有这个好的示例,那就太好了!谢谢你的把戏