如何将 firebase 的 firestore/admin sdk 与 next.js 一起使用
Posted
技术标签:
【中文标题】如何将 firebase 的 firestore/admin sdk 与 next.js 一起使用【英文标题】:How can I use firebase's firestore/admin sdk with next.js 【发布时间】:2019-10-24 11:10:29 【问题描述】:我正在使用 firebase 和 next.js 构建一个应用程序
我对这个设置相当陌生,对 s-s-r 完全陌生,而且 firebase 文档让我感到困惑。
目前,我正在使用 firebase 函数来运行 next.js,这就像一个魅力。但是现在,我想使用firestore。根据文档,我看到了两种在我的项目中使用它的方法(如果我做对了)。第一个是对我没有好处的“网络”解决方案,因为我相信它不是 s-s-r,而我的应用程序的全部意义就是这样。
另一个是“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】:抱歉,回答不好。这是我的第一次。我正在寻找更可爱的代码,但发现没有回答你的问题。
我不知道正确的行话。然而,您还没有使用自定义服务器运行您的应用程序。至少这就是我使用 firebase-admin 所做的事情。请注意,我的答案很糟糕,因为我通过 socket.io 与我的客户进行了交流。我只将 firebase 用于客户端代码和身份验证
在 package.json 中,您将脚本标签添加到命令行中
"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'));
)
【讨论】:
以上是关于如何将 firebase 的 firestore/admin sdk 与 next.js 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Firestore iOS:如何将图像保存到 Firestore 中的集合中?
如何将firebase存储下载URL保存到firestore集合?
如何将图像上传到firebase存储然后将图像url存储在firestore中?
将 Firebase 存储下载 URL 推送到 Firebase 云 Firestore