我将 firebase 用于 auth 和 db,并将 AWS lambda 用于云函数。
要将 firebase 添加到我的 JS 项目中,我initializeApp将 firebase 配置作为参数,如下所述:https : //firebase.google.com/docs/web/setup。
如此处所述:https : //firebase.google.com/docs/admin/setup,我还需要initializeApp在我的 lambda 函数中。
如下:
const admin = require('firebase-admin');
const serviceAccount = require('../path/to/service-account.json');
const firebaseAdmin = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "dB_URL"
});
Run Code Online (Sandbox Code Playgroud)
凭据来自 firebase-admin 库,因此我无法将其添加到我的 web firebase 配置中。所以,我需要初始化两次。
但是,如果我这样做,服务器将抛出错误:
默认 Firebase 应用已存在。这意味着您多次调用 initializeApp() 而不提供应用程序名称作为第二个参数。在大多数情况下,您只需要调用 initializeApp() 一次。但如果您确实想初始化多个应用程序,请将第二个参数传递给 initializeApp() 以给每个应用程序一个唯一的名称。
我在这里错过了什么吗?最佳做法是什么?我糊涂了。
之前有人遇到过同样的问题:使用 Firebase SDK 和 Netlify Lambda 函数
对该用户有用的是使用此处记录的 REST API:https : //firebase.google.com/docs/projects/api/workflow_set-up-and-manage-project …
因此,我有一个操作创建器,我想从 API 端点获取数据。
以下作品:
export function getData(){
return function(dispatch){
axios.get('/api/form/myuser/mytitle').then( (res) => {
console.log(res.data);
return dispatch(retrieve(res.data))
})
.catch( (err) => {
console.log(err)
})
}
}
Run Code Online (Sandbox Code Playgroud)
然而,就我而言,API 端点发生了变化。我首先向此 URL 发出服务器请求:/api/form/:userId/:title
然后,我真正想做的是上面的操作创建者,在我的客户端上使用 axios get 请求,如下所示:
axios.get('/api/form/:userId/:title')
Run Code Online (Sandbox Code Playgroud)
这里的控制台日志显然不会返回标题字符串,它返回:title
有可能做我想做的事吗?如果没有,有什么建议吗?
因此,我希望我的用户会话在登录/注册时持续存在,但事实并非如此。
官方文档说要添加以下内容:
app.use(express.session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)
我做到了。然后它继续指定:
在典型的 Web 应用程序中,用于验证用户身份的凭据仅在登录请求期间传输。如果身份验证成功,将通过用户浏览器中设置的 cookie 建立并维护会话。每个后续请求将不包含凭据,而是包含标识会话的唯一 cookie。为了支持登录会话,Passport 将对会话中的用户实例进行序列化和反序列化。
passport.serializeUser(function(user, done) {
console.log("serialize user: ", user);
done(null, user[0]._id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,登录后,用户应该看到一个新的 cookie 被设置。我的序列化和反序列化功能似乎有效。当我登录用户后,控制台将记录用户详细信息。控制台中没有错误消息。但是,当我登录用户时,我没有看到任何 cookie。
我应该手动添加额外的命令吗?像这样的东西:
res.cookie('userid', user.id, { maxAge: 2592000000 });
Run Code Online (Sandbox Code Playgroud)
我正在使用 Redux,那么我是否应该使用经过身份验证的(true 或 false)变量通过化简器处理持久会话?
我想我现在对服务器端应该做什么和客户端应该做什么之间有点困惑。
我正在努力让 Stripe 在我的服务器上工作。
所以,在客户端,我有这个代码(在努力让元素工作之后):
this.props.stripe.createPaymentMethod({ type: 'card', card: cardElement, billing_details: { name: name } }).then((paymentMethod) => {
// server request with customer_id and paymentMethod.id);
});
Run Code Online (Sandbox Code Playgroud)
这工作正常。现在,在服务器 (NodeJS) 上,我想为我的客户添加一个固定费用的新订阅。
这是我所拥有的:
const paymentIntent = await stripe.paymentIntents.create({
amount: 1000,
currency: 'usd',
payment_method_types: ['card'],
customer: req.body.customer_id,
metadata: { integration_check: 'accept_a_payment' },
});
const paymentIntentConfirmation = await stripe.paymentIntents.confirm(paymentIntent.id, { payment_method: req.body.paymentMethod_id });
const newSubscription = await stripe.subscriptions.create({
customer: req.body.customer_id,
items: [{ plan: premium_plan.id, quantity: 1 }],
default_payment_method: req.body.paymentMethod_id,
});
const attachPaymentToCustomer = await stripe.paymentMethods.attach(req.body.paymentMethod_id, { …Run Code Online (Sandbox Code Playgroud) node.js ×2
redux ×2
aws-lambda ×1
axios ×1
firebase ×1
passport.js ×1
payment ×1
react-redux ×1