Синтаксическая ошибка: Неожиданный токен ‘

#node.js #express

Вопрос:

Я просто пытаюсь настроить SSR в узле, но когда я пытаюсь импортировать компонент React на сервер, я получаю эту ошибку:

Синтаксическая ошибка: Неожиданный токен ‘

Пробовал включать "type": "module" в package.json себя, но ничего не изменилось. Это мое server.js досье:

 const express = require("express");
const mongoose = require('mongoose');
const path = require("path");
import ReactDOMServer from 'react-dom/server';

import Home from './client/src/Home';

const port = process.env.PORT || 5000;
const app = express();
const { API_VERSION } = require('./config');

// Load routings
const userRoutes = require("./routers/user");
const postRoutes = require("./routers/post");
const commentsRoutes = require("./routers/comment");
const policyRoutes = require("./routers/policy");

app.use(express.urlencoded({ extended: true}));
app.use(express.json());

const uri = "MONGO_URL"
mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }, (err, res) => {
  if (err) {
    throw err;
  } else {
    console.log("Connected to DB!.");
  }
})

// Configue http
app.use((req, res, next) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.header(
        "Access-Control-Allow-Headers",
        "Authorization, X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Request-Method"
    );
    res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE");
    res.header("Allow", "GET, POST, OPTIONS, PUT, DELETE");
    next();
});

app.use(`/api/${API_VERSION}`, userRoutes);
app.use(`/api/${API_VERSION}`, postRoutes);
app.use(`/api/${API_VERSION}`, commentsRoutes);
app.use(`/api/${API_VERSION}`, policyRoutes);

if (process.env.NODE_ENV === 'production') {
  app.use(express.static('client/build'));
}

app.use(express.static('./build'));

app.get('/', (req, res) => {
  const home = ReactDOMServer.renderToString(<Home />); //THIS IS THE LINE THAT THROWS THE ERROR

  const indexFile = path.resolve('./build/index.html');
  fs.readFile(indexFile, 'utf8', (err, data) => {
    if (err) {
      console.error('Something went wrong:', err);
      return res.status(500).send('Oops, better luck next time!');
    }

    return res.send(
      data.replace('<div id="root"></div>', `<div id="root">${home}</div>`)
    );
  });
});

app.listen(port, () => {
  console.log(`Servidor funcionando en el puerto ${port}`)
})
 

Конфигурация веб-пакета:

 const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  entry: './server.js',

  target: 'node',

  externals: [nodeExternals()],

  output: {
    path: path.resolve('server-build'),
    filename: 'index.js'
  },

  module: {
    rules: [
      {
        test: /.js$/,
        use: 'babel-loader'
      }
    ]
  }
};
 

Конфигурация Вавилона:

 {
    "presets": [
      "@babel/preset-env",
      "@babel/preset-react"
    ]
  }
 

Ответ №1:

Вы не можете использовать импорт и требовать одновременно. Они используют разные системы модулей, либо используют require(CommonJS), либо импортируют(ES6).

Кроме того, вам нужно изменить импорт react, чтобы он требовал такого:

 const ReactDOMServer = require('react-dom/server');
const Home = require('./client/src/Home'); // give the correct path
 

Кроме того, вы должны изменить его вещи в package.json, удалить "type":"module" .