繁体   English   中英

Node.js 中视图子文件夹的 pug 渲染模板(express)

[英]pug rendering templates of view subfolders in Node.js (express)

当所有模板都在 views 文件夹中时,我们就成功渲染了它们。 我制作了文件夹和视图的结构,然后内部模板对于渲染不可见。

这是我的文件夹的结构,并且对于render()contacts.pug模板是不可见的

在此处输入图片说明

应用程序.js

    const createError = require('http-errors');
    const express = require('express');
    const path = require('path');
    const cookieParser = require('cookie-parser');
    const logger = require('morgan');

    const indexRouter = require('./routes/index');
    const usersRouter = require('./routes/users');

    const app = express();

    // view engine setup
    app.set('views', [path.join(__dirname, '/views'),
        path.join(__dirname, '/views/public'),
        path.join(__dirname, '/views/public/templates'),
        path.join(__dirname, '/views/public/fragments')]);
    app.set('view engine', 'pug');

    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({extended: false}));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));

    app.use('/', indexRouter);
    app.use('/users', usersRouter);

    // catch 404 and forward to error handler
    app.use(function (req, res, next) {
        next(createError(404));
    });

    // error handler
    app.use(function (err, req, res) {
        // set locals, only providing error in development
        res.locals.message = err.message;
        res.locals.error = req.app.get('env') === 'development' ? err : {};

        // render the error page
        res.status(err.status || 500);
        res.render('error');
    });

    module.exports = app;

索引.js

    const express = require('express');
    const router = express.Router();

    /* GET home page. */
    router.get('/', (req, res, next) => {
      res.render('index', {});
    });

    router.get('/about', (req, res, next) => {
      res.render('about_us.pug');
    });

    router.get('/portfolio', (req, res, next) => {
      res.render('portfolio');
    });

    router.get('/contacts', (req, res,next) => {
      res.render('/public/templates/contacts',{});
    });

     router.get('/products', (req, res, next) => {
      res.render('products.pug');
    });

    module.exports = router;

联系人.pug

    extends views/layout

                    block content
                        h1 contacts

布局.pug

     html
        head
            title= title
           link(rel='stylesheet', href='/stylesheets/style.css')
        body
            include public/fragments/header
            block content

头文件

    block header

    link(rel='stylesheet', href='./stylesheets/public/fragments/header.css')

    div
        ul
            li: a(href='/') Home
            li: a(href='/about') About
            li: a(href='/portfolio') Portfolio
            li: a(href='/contacts') Contact
            li: a(href='/products') Products

错误

错误:无法在视图目录“C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\views”、“C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\views\\public”、“ C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\views\\public\\templates" 或 "C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\views\\public\\fragments" at Function.render (C:\\Users\\Xiaomi\\IdeaProjects\\ online_shop_server\\node_modules\\express\\lib\\application.js:580:17) 在 ServerResponse.render (C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\node_modules\\express\\lib\\response.js:1008:7) 在 C:\\ Users\\Xiaomi\\IdeaProjects\\online_shop_server\\routes\\index.js:18:7 at Layer.handle [as handle_request] (C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\node_modules\\express\\lib\\router\\layer.js:95 :5) 在接下来 (C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\node_modules\\express\\lib\\router\\route.js:137:13) 在 Route.dispatch (C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\node_modules \\express\\lib\\router\\route.j s:112:3) 在 Layer.handle [as handle_request] (C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\node_modules\\express\\lib\\router\\layer.js:95:5) 在 C:\\Users\\Xiaomi\\ IdeaProjects\\online_shop_server\\node_modules\\express\\lib\\router\\index.js:281:22 at Function.process_params (C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\node_modules\\express\\lib\\router\\index.js:335:12 ) 接下来 (C:\\Users\\Xiaomi\\IdeaProjects\\online_shop_server\\node_modules\\express\\lib\\router\\index.js:275:10)

我这样解决了我的问题:

-app.js添加app.locals.basedir = path.join (__ dirname, 'views'); ,在视图文件夹中添加了所需子文件夹的默认路径。

    const createError = require('http-errors');
    const express = require('express');
    const path = require('path');
    const cookieParser = require('cookie-parser');
    const logger = require('morgan');

    const indexRouter = require('./routes/index');
    const usersRouter = require('./routes/users');

    const app = express();

    // view engine setup
    app.set('views', [path.join(__dirname, '/views'),
        path.join(__dirname, '/views/public'),
        path.join(__dirname, '/views/public/templates'),
        path.join(__dirname, '/views/public/fragments'),
        path.join(__dirname, '/views/public/templates/layout')]);
    app.set('view engine', 'pug');

    app.locals.basedir = path.join(__dirname, 'views');

    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({extended: false}));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));

    app.use('/', indexRouter);
    app.use('/users', usersRouter);

    // catch 404 and forward to error handler
    app.use(function (req, res, next) {
        next(createError(404));
    });

    // error handler
    app.use(function (err, req, res) {
        // set locals, only providing error in development
        res.locals.message = err.message;
        res.locals.error = req.app.get('env') === 'development' ? err : {};

        // render the error page
        res.status(err.status || 500);
        res.render('error');
    });

    module.exports = app;


-在更新视图文件夹中的文件夹结构和 pug 文件后,在链接处理程序中index.js添加了正确的模板路径。

    const express = require('express');
    const router = express.Router();

    /* GET home page. */
    router.get('/', (req, res, next) => {
      res.render('index', {});
    });

    router.get('/about', (req, res, next) => {
      res.render('about_us',{});
    });

    router.get('/portfolio', (req, res, next) => {
      res.render('portfolio',{});
    });

    router.get('/contacts', (req, res,next) => {
      res.render('contacts',{});
    });

    router.get('/products', (req, res, next) => {
      res.render('products',{});
    });



    module.exports = router;

在此处输入图片说明

老问题,但其他人可能有类似的问题,这是我的解决方案。

我建议您在与views文件夹相同的级别(不在其中)创建public目录。 然后使用

app.set('view engine', 'pug');
app.set('views','./views');
app.use(express.static(path.join(__dirname, './public')));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM