簡體   English   中英

如何在 next.js 中使用 firebase 的 firestore/admin sdk

[英]How can I use firebase's firestore/admin sdk with next.js

我正在用 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 建立服務器端連接的方法。

抱歉回答不好。 這是我第一次。 我正在尋找更可愛的 cookie 代碼,但發現您的問題沒有得到解答。

我不知道正確的行話。 然而,您還沒有使用自定義服務器運行您的應用程序。 至少這就是我使用 firebase-admin 所做的。 請注意,我的回答很糟糕,因為我通過 socket.io 與我的客戶進行了交流。 我只將 firebase 用於客戶端代碼和身份驗證

在 package.json 中,您將腳本標記添加到 stratfrom 命令行

{
    "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 服務器。 但是,如下所示,我實際使用 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'));
        })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM