node.js - 如何在服务器端渲染中使用 Mongodb

我正在尝试使用 React、React Router 和 webpack 在 Express 中建立基本的 Mongoose 连接

有没有 ssr 和 Mongodb 的例子?

服务器应该是什么样的?



const app = express();
app.use(express.static("./build"));
app.get("*", (req, res) => {
      const url = req.originalUrl || req.url;
      const context = {};
      const indexFile = path.resolve("./build/main.html");
      if (context.url) {
            req.header("Location", context.url);
            return res.send(302);
      }
      const css = new Set();
      const insertCss = (...styles) =>
            styles.forEach((style) => css.add(style._getCss()));
      const appContent = ReactDOMServer.renderToString(
            <StyleContext.Provider value={{ insertCss }}>
                  <StaticRouter
                        location={req.url}
                        context={context}
                  ></StaticRouter>
            </StyleContext.Provider>
      );
      fs.readFile(indexFile, "utf8", (err, data) => {
            if (err) {
                  console.log(err);
                  return res.status(500).send("ne rabotaet");
            }
            data = data.replace("__STYLES__", [...css].join(""));
            data = data.replace(
                  "<div id=app></div>",
                  `<div id=app>${appContent}</div>`
            );

            return res.send(data);
      });
});
app.listen(3000, () => {
      console.log("Listenning on port: ", 3000);
});

最佳答案

请引用下面的服务器模板,它用于带有 Mongoose 连接的 Next Js 项目(SSR)。 server.js

require('dotenv').config();
    
    const express = require('express');
    const server = express();
    const bodyParser = require('body-parser');
    const mongoose = require('mongoose');
    const next = require('next');
    
    const dev = process.env.NODE_ENV !== 'production';
    const app = next({dev});
    
    const routes = require('./routes');
    const routerHandler = routes.getRequestHandler(app);
    
    const {config} = require('../config');
    
    const transactionRouter = require('./api/transaction');
    
    app.prepare().then(() => {
        // Parse application/x-www-form-urlencoded
        server.use(bodyParser.urlencoded({extended: false}));
        // Parse application/json
        server.use(bodyParser.json());
    
        // Allows for cross origin domain request:
        server.use(function (req, res, next) {
            res.header('Access-Control-Allow-Origin', '*');
            res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
            next()
        });
        console.log("mongodb ", config.databaseUrl);
        // MongoDB
        mongoose.Promise = Promise;
        mongoose.connect(config.databaseUrl, {useNewUrlParser: true});
        const db = mongoose.connection;
        db.on('error', console.error.bind(console, 'connection error:'));
    
        // REST API routes
        server.use('/api/transactions', transactionRouter);
    
        // Next.js page routes
        server.get('*', routerHandler);
    
        // Start server
        server.listen(config.serverPort, () => console.log(`${config.appName} running on http://localhost:${config.serverPort}/`))
    });

https://stackoverflow.com/questions/62655947/

相关文章:

angular - 具有父/子关系的 Angular 组件中的通用类型定义

c# - CreatedAtAction 结果为 "No route matches the sup

python - 线程 Tornado + flask 应用程序的正确方法是什么?

python - 如何使用环境变量设置 boto3 连接超时和读取超时?

testing - 在 Cypress 中运行测试的所有断言

node.js - NodeMailer - G-Suite - 服务账户 - 以群组邮件形式发送

google-apps-script - 如何使用 GAS 获取文档中的 URL 并将其替换为 UR

react-native - 当应用程序已经安装时,如何从 React Native 中的实际应用程

html - 如何禁用 Angular 匹配

python-3.x - Python中存在数值数据时如何解决TypeError : 'No Num