【发布时间】:2017-11-27 17:07:39
【问题描述】:
我正在关注本教程 - https://www.youtube.com/watch?v=Smk2FusU_70(正好在 28:38 标记)
但是它是在 v4 之前发布的,我收到了一个错误:
/Users/morganallen/Desktop/react_ssr/myapp/server/index.js:55
match({routes, location: req.url}, (error, redirect, ssrData) => {
^
TypeError: match is not a function
at fs.readFile (/Users/morganallen/Desktop/react_ssr/myapp/server/index.js:55:13)
at tryToString (fs.js:455:3)
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:442:12)
我在这个答案中看到他似乎遇到了类似的问题 - What's wrong with this ReactRouter.match() implementation?
虽然我不太确定在else{} 语句中对match({}) 进行更改
我应该怎么做才能让它工作?
require('import-export')
require('babel-core/register')({presets: ['es2015', 'react']})
const http = require('http')
const path = require('path')
const fs = require('fs')
const express = require('express')
const react = require('react')
const reactRouter = require('react-router')
const reactDomServer = require('react-dom/server')
const renderToString = reactDomServer.renderToString
const match = reactRouter.match
const RouterContext = reactRouter.RouterContext
const staticFiles = [
'/static/*',
'/logo.svg',
'/asset-manifest.json',
'/favicon.ico'
]
const app = express()
app.server = http.createServer(app)
app.use(express.static('../build'))
staticFiles.forEach(file => {
app.get(file, (req, res) => {
const filePath = path.join(__dirname, '../build', req.url)
res.sendFile(filePath)
})
})
const routes = require('../src/routes').default()
app.get('*', (req, res) => {
const error = () => res.status(404).send('404')
const htmlFilePath = path.join(__dirname, '../build', 'index.html')
fs.readFile(htmlFilePath, 'utf8', (err, htmlData) => {
if(err) {
error()
}
else{
match({routes, location: req.url}, (error, redirect, ssrData) => {
if(error){
error()
}
else if(redirect){
res.redirect(302, redirect.pathname + redirect.search)
}
else if(ssrData){
const ReactApp = renderToString(react.createElement(RouterContext, srrData) )
const RenderApp = htmlData.replace('{{SSR}}', ReactApp)
res.status(200).send(RenderApp)
}
else{
error()
}
})
}
})
})
app.server.listen( process.env.PORT || 8080)
console.log(app.server.address().port)
我的 package.json 文件
{
"name": "myapp",
"version": "0.1.0",
"private": true,
"dependencies": {
"babel-core": "^6.26.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"import-export": "^1.0.1",
"react": "^16.1.1",
"react-dom": "^16.1.1",
"react-router": "^4.2.0",
"react-router-dom": "^4.2.2",
"react-scripts": "1.0.17"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
}
【问题讨论】:
-
你用的是什么版本的 react-router?
-
4.2 添加了我的 package.json 文件
-
mount在 4.2 中不存在。好像您的教程使用的是 v3.x。如果您希望教程代码正常工作,您应该安装 3.x。 v3 -> v4 是对许多 react-router api 的重大突破。 -
我在哪里使用了 mount?我该怎么做才能使它适用于 4.2
-
对不起,我的意思是
match:P
标签: javascript node.js reactjs