如何在next.js

时间:2019-06-10 02:18:26

标签: reactjs firebase next.js firebase-admin ssr

我正在使用firebase和next.js构建应用程序

对于此设置,我是一个新手,对SSR来说是个新手,而Firebase文档让我感到困惑。

当前,我正在使用firebase函数来运行next.js,它的工作原理很吸引人。但是现在,我想使用Firestore。根据文档,我看到了在项目中使用它的两种方法(如果我理解正确的话)。第一个是“网络”解决方案,对我来说不会有好处,因为我认为它不是SSR,而我的应用程序的重点仅在于此。

另一个是'node.js'解决方案,它在firebase函数上运行,这对我来说意义更大。我不知道的部分是与Next.js一起使用

在当前设置中,我正在构建我的next.js应用程序到 函数文件夹,在函数文件夹中,我可以引用使用'node.js'解决方案创建的databaseref对象,但是在构建下一个应用程序之前,如何在 之前引用它?所以当我不在功能文件夹中时?

设置:

- src
  - utils
  - pages
    - index.js
    - signin.js
    - // etc.
- functions 
  - next // this is the output folder of my 'src' build
  - index.js 
  - // etc.

functions/index.js内部,我可以这样做:

const admin = require('firebase-admin');
const functions = require('firebase-functions');

admin.initializeApp(functions.config().firebase);

let db = admin.firestore();

并使用db读取并添加到服务器端Firestore中(对吗?)

但是在构建它之前,我所有的代码都位于src/中,我认为我无法在其中使用它。我的项目结构应该不同吗?或者我应该怎么做才能使用db?或者,当然,还有另一种方法可以与我的Firestore建立服务器端连接。

1 个答案:

答案 0 :(得分:1)

很抱歉,您的回答不正确。这是我第一次我一直在寻找Cookie切割程序代码,却发现您的问题没有得到解决。

我不知道正确的行话。但是,您尚未通过自定义服务器运行应用程序。这就是我使用firebase-admin所做的。注意,在这里我的答案很糟糕,因为我通过socket.io与客户端进行了交互。我只将Firebase用于客户端代码和身份验证

在package.json中,您正在从命令行将script标签添加到strat

{
    "scripts:
        "server": "node server.js"
}

使它可以运行

$ npm run server

从命令行

〜/ package.json

    {
  "name": "app",
  "version": "0.1.0",
  "private": true,
  "scripts": {
  "server": "node server.js",
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "next": "9.3.1",
    "react": "16.13.1",
    "react-dom": "16.13.1"
  }
}

在server.js文件中,您为服务器端渲染加载了express,可能可以在另一篇文章中启动您自己的http服务器。但是,如下所示,我actullay使用socket.io,因此它具有该连接详细信息 关键就在这里

nextHandler()将服务器的控制权传递给下一个。因此,您可能可以启动http服务器并使用nextHandler()

  app.get('*', (req, res) => {
                return nextHandler(req, res)
            })

〜/ server.js

    const fs = require('fs');
    const express = require('express');
    const app = express();
    const server = require('http').Server(app)
    const firebaseAdmin = require('./services/dwf.firebase.admin.js');
    const secureServer = require('https').createServer({
        key: fs.readFileSync('./key.pem'),
        cert: fs.readFileSync('./cert.pem')
    }, app)
    const io = require('socket.io')(secureServer, {secure: true})

    const User = require('../../users/user.manager.js');
    let user = User(io,firebaseAdmin.auth(),firebaseAdmin.database());

    const next = require('next')

    const dev = process.env.NODE_ENV !== 'production'
    const nextApp = next({dev})
    const nextHandler = nextApp.getRequestHandler()

    // socket.io server
    io.on('connection', socket => {
        console.log(`Main Socket Opened by:\n ${socket.id}`);
        socket.on('getDb',function(userId,refs,fn){
        console.log("Getting Data")
            firebaseAdmin.database().ref(refs).once('value',(snapshot)=>{
                console.log(snapshot.val());
                fn({body: snapshot.val()})
                socket.emit('getDb',snapshot.val());
            });
        })
        socket.on('disconnect', () => {
            console.log(`Main Socket Closed by:\n ${socket.id}`);
        });
    })

    nextApp
        .prepare()
        .then(() => {
            app.get('/data/messages', (req, res) => {
                res.json(messages)
            })
            app.get('*', (req, res) => {
                return nextHandler(req, res)
            })
            secureServer.listen(PORT, () => console.log('#> Main Server ready for clients on https://0.0.0.0:PORT'));
        })