2017-04-03 156 views
-1

當試圖呈現我的第二頁(服務)我發現它只是呈現主頁。我很新,表達和節點,所以我不明白爲什麼。無法res.render()與express.js

import config from './config'; 
import apiRouter from './api'; 
import express from 'express'; 
const server = express(); 

import {home, services} from './serverRender'; 

server.set('view engine', 'ejs'); 

server.get('/', (req, res) => { 
var contents = home(); 
    res.render('index', { 
    content: contents 
}); 
}); 
server.get('/services', (req, res) => { 
    var contents = services(); 
    res.render('services', { 
    content: contents 
}); 
}); 


server.use(express.static('public')); 


server.listen(config.port,() => { 
    console.info('Express listening on port', config.port); 
}); 

serverRender.js:

import React from 'react' 
import ReactDOMServer from 'react-dom/server' 

import Home from './src/components/Home' 
import Services from './src/components/Services' 

import config from './config'; 

const home =() => { 
    ReactDOMServer.renderToString(
     <Home /> 
    ); 
}; 
const services =() => { 
    ReactDOMServer.renderToString(
     <Services /> 
    ); 
}; 




export {home, services} 

index.ejs和services.ejs(他們得到了相同的代碼)

<%- include('header') -%> 
    <div id="root"><%- content -%></div> 
<%- include('footer') -%> 

config.js

const env = process.env 

export const nodeEnv = env.NODE_ENV || 'development' 


export default { 
    port: env.PORT || 8080, 
    host: env.HOST || '0.0.0.0', 
    get serverUrl() { 
     return `http://${this.host}:${this.port}`; 
    } 
}; 

指數.js

import React from 'react'; 
import ReactDOM from 'react-dom'; 

import App from './components/App'; 

ReactDOM.render(
    <App initialContests={window.initialData.contests} />, 
    document.getElementById('root') 
); 

UPDATE

我已經想通了,由於某種原因,快遞只渲染index.js。我認爲這可能與我的webpack配置有關,這個文件被列爲條目。我不知道如何解決它,任何幫助將不勝感激。

+0

你的配置文件是什麼樣的?我忍不住感覺你的代碼中還有其他的東西干擾 –

+0

我會發布這個以及 – anoop

+0

我看到你在使用JSX,這意味着你必須使用Webpack或類似的東西。查看這些應用程序的輸出,看看它是否正確。 此外,我強烈建議你不要使用'字符,因爲這通常是一個SQL引用表示一個表或一個值。 –

回答

0

使用Express with a template engine時,您需要在Express服務器上聲明您的視圖的位置與'views'設置。

此外,請確保您在需要的路由之前(即靜態內容)分配您的中間件。 Express從上到下評估中間件和路由,因此如果您將靜態內容放置在路由之後,並且該路由依賴於靜態資源,那麼在路由需要它之前,它將不會變爲靜態。

const express = require('express') 
const path = require('path') 
const server = express() 

const port = process.env.PORT || 1337 

// res.render() will now look in './views' for the templates 
server.set('views', path.join(__dirname, 'views')) 
server.set('view engine', 'ejs') 

server.use(express.static(path.join(__dirname, 'public'))) 

// Your Router Middleware/Routes goes here 

server.listen(port,() => { 
    console.log(`Listening on ${port}`) 
}) 
+0

這是知道所有有用的東西,但它並沒有解決我的問題。當我爲每個頁面分開ejs文件時,爲什麼不呈現內容? – anoop

+0

對於這兩條路線,「內容」是否得到同步評估? – peteb

+0

我相信他們是同步的。我在上面添加了更多代碼,希望您能看到更多。 – anoop