【问题标题】:pug rendering templates of view subfolders in Node.js (express)Node.js 中视图子文件夹的 pug 渲染模板(express)
【发布时间】:2020-01-16 16:08:54
【问题描述】:

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

这是我的文件夹结构,contacts.pugtemplate 对render() 不可见

app.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;

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.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;

contacts.pug

    extends views/layout

                    block content
                        h1 contacts

layout.pug

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

header.pug

    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”中查找视图“/public/templates/contacts” ", "C:\Users\Xiaomi\IdeaProjects\online_shop_server\views\public\templates" 或 "C:\Users\Xiaomi\IdeaProjects\online_shop_server\views\public\fragments" 在 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 在 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.js: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 在 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.locals.basedir = path.join(__dirname, 'views');添加到app.js的问题
  • 如果已解决,请将下面的解决方案作为答案发布并接受,以帮助未来的访问者。

标签: javascript


【解决方案1】:

我这样解决了我的问题:

-app.jsapp.locals.basedir = path.join (__ dirname, 'views');中添加,在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;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-28
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多