Макет не отображается для отдельного файла маршрута - PullRequest
0 голосов
/ 04 октября 2019

У меня есть экспресс-приложение с использованием руля. У меня есть один файл маршрута (index.js -> localhost: 3000 /), используемый для обслуживания некоторых представлений. Но затем я также создал другой файл маршрута (agency.js -> localhost: 3000 / agency /), чтобы в одном файле не было сотен строк кода.

Проблема заключается в том, что при загрузкеКонечная точка / agency, показывает только файл handlebars. Он не использует макет по умолчанию, заданный в app.js.

Когда я загружаю localhost: 3000 /, он отображает макет без проблем.

1 Ответ

0 голосов
/ 10 октября 2019

Вы должны действительно показать, какой код у вас есть, потому что ваши настройки будут отличаться от моих, поэтому, если я дам вам свой код, это будет сложно, потому что я не использую значения по умолчанию.

У вас 2 проблемы.

  1. Вы хотите использовать разные файлы маршрутов

  2. У вас проблемы с файлами макетов

Решение для 1: используйте app.use

файл index.js

app.use('/agency', require(`agency`)) // make route use the route file in root/agency.js

файл agency.js

app.get('/', (req, res) => { // this is using your /agency and its only / because its using /agency. If you want /agency/test then you use /test
    res.render(`viewHandlebarsFile`) // calling your handlebar view file
})

руль основного файла макета (по умолчанию):Убедитесь, что вы поместили это в тег body, он будет вызывать ваш файл просмотра руля

{{{body}}}

Как это работает: ваш файл index.js указывает маршрут / agencyв ваш маршрутный файл agency.js

Ваш agency.js получает файл вида руля.

Ваш файл вида руля - только тело. В вашем файле макета по умолчанию будет использоваться тег {{{body}}}, и это тело будет вызывать ваш файл просмотра руля.

Как я уже сказал, не зная, как настроить значения по умолчанию, трудно помочь вам без вашегокоды. Я дал вам код ключа для использования, который должен работать в соответствии с вашими настройками. Удачи вам.

Ниже у меня есть схема скелета для вас, если у вас возникли проблемы. Файл

app.js находится в вашей корневой папке

const express = require('express')
const app = express()
const path = require('path')
const exphbs = require('express-handlebars');

app.set('views', path.join(__dirname, 'views'))
app.engine('hbs', exphbs({defaultLayout: 'main', extname: '.hbs'})) // change extension to .hbs
app.set('view engine', 'hbs')

app.set('port', (process.env.PORT || 3000))

app.get('/', (req, res) => {
    res.render('home', {
        content: 'This is some content', // for dynamic content, in view use {{content}} to call this data
        published: false
    })
})

app.use('/agency', require(`./agency`)) 

app.listen(app.get('port'), () => {
    console.log('Server started on port' + app.get('port'))
})
*Файл 1039 * agency.js находится в корневой папке
const express = require('express')
const exphbs = require('express-handlebars')
const app = module.exports = express()

app.get('/', (req, res) => { // this is using your /agency and its only / because its using /agency. If you want /agency/test then you use /test
    res.render(`view2`) // calling your handlebar view file
})

В папке с вашими представлениями, расположенной в корневом каталоге

home.hbs

<h1>Welcome Home Page</h1>

view2.hbs, расположенной впапка с вашими представлениями

<h1>View 2 page</h1>

Внутри папки раскладок, которая находится внутри вашей папки с представлениями

main.hbs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Handlebars Express</title>
</head>
<body>
    {{{body}}}
</body>
</html>
...