我正在使用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建立服务器端连接。
答案 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'));
})