[英]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.