我有一个使用firebase服务帐户的节点应用程序.我想将应用程序部署到Heroku,但我不想公开我的密钥.我直接从公共github仓库部署,所以我不想在部署中包含服务帐户文件.
我可以使用服务帐户json文件,使每个属性成为一个环境变量,将每个变量添加到Heroku并进行部署.一切都很好(在我的firebase应用程序上授权新的Heroku域之后),但是有更好的方法吗?这是有效的,但这样做很麻烦(复制和粘贴每个变量并移动它).我错过了一个更简单的方法吗?
这是我正在做的改变.从这一行中,它从文件中提取凭据:
admin.initializeApp({
credential: admin.credential.cert('./path/firebase-service-account.json'),
databaseURL: "https://my-firebase-app.firebaseio.com"
});
Run Code Online (Sandbox Code Playgroud)
对于从环境变量引入所有相同内容的对象:
admin.initializeApp({
credential: admin.credential.cert({
"type": process.env.FIREBASE_TYPE,
"project_id": process.env.FIREBASE_PROJECT_ID,
"private_key_id": process.env.FIREBASE_PRIVATE_KEY_ID,
"private_key": process.env.FIREBASE_PRIVATE_KEY,
"client_email": process.env.FIREBASE_CLIENT_EMAIL,
"client_id": process.env.FIREBASE_CLIENT_ID,
"auth_uri": process.env.FIREBASE_AUTH_URI,
"token_uri": process.env.FIREBASE_TOKEN_URI,
"auth_provider_x509_cert_url": process.env.FIREBASE_AUTH_PROVIDER_X509_CERT_URL,
"client_x509_cert_url": process.env.FIREBASE_CLIENT_X509_CERT_URL
}),
databaseURL: "https://my-firebase-app.firebaseio.com"
});
Run Code Online (Sandbox Code Playgroud)
这是将带有服务帐户的firebase应用程序部署到Heroku的最佳实践吗?我正在使用dotenv节点模块来完成此任务.
heroku environment-variables node.js firebase firebase-authentication
我目前使用的Angular 1.5.8
,Firebase 3.3.0
和AngularFire 2.0.2
.当我调用时$firebaseAuth.$signInWithPopup
,promise会返回一个包含的firebase用户firebase.user.idToken
,但是当我调用时$onAuthStateChanged
,firebase用户不会返回.user
属性.从$ onAuthStateChanged函数用于服务器身份验证的正确令牌是什么?
我正在使用该md
属性,但随后它停止工作并切换到kd
属性,我意识到并非每个用户都有.这是_lat
财产吗?它似乎以这种方式工作,但我似乎无法找到任何有关它的文档.或者这不是在Auth State Change上使用令牌的正确方法吗?有最好的做法吗?这是我从承诺中返回的对象.
我为图像道歉,但奇怪的是,如果我JSON.stringify(firebaseUser)并打印它,我最终得到一个完全不同的对象,在那里firebaseUser.stsTokenManager.accessToken
会给我正确的密钥,但如果我尝试firebaseUser.stsTokenManager.accessToken
它说这stsTokenManager
是未定义的.
{
"uid": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"displayName": "Luke Schlangen",
"photoURL": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"email": "XXXXXXXXXXXXXXXXXX@XXXXX.com",
"emailVerified": true,
"isAnonymous": false,
"providerData": [
{
"uid": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"displayName": "Luke Schlangen",
"photoURL": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"email": "XXXXXXXXXXXXXXXXXX@XXXXX.com",
"providerId": "google.com"
}
],
"apiKey": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"appName": "[DEFAULT]",
"authDomain": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"stsTokenManager": {
"apiKey": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"refreshToken": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"accessToken": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"expirationTime": …
Run Code Online (Sandbox Code Playgroud) 我正在使用node-postgres
生产应用程序,我想知道是否有任何我应该关注的事项?数据是否自动消毒node-postgres
?
我在github页面上找不到任何关于它的信息:https://github.com/brianc/node-postgres
在某些情况下,当我的节点/快递服务器上遇到特定路由时,我想向 API 发出请求并将该响应直接返回给客户端。我关注了这个堆栈溢出帖子:Send response from server side axios request to React/Redux app
要创建这个:
router.use('/', async (req, res) => {
const apiUrl = `https://assets.scratch.mit.edu${req.url}`;
console.log(apiUrl);
const scratchResponse = await axios.get(apiUrl);
try {
res.send(scratchResponse);
console.log('worked!', apiUrl);
} catch (error) {
console.log('error in assets get request', apiUrl, error);
res.sendStatus(500);
}
});
Run Code Online (Sandbox Code Playgroud)
这适用于某些请求,但会因错误而中断其他请求:
TypeError: Converting circular structure to JSON
Run Code Online (Sandbox Code Playgroud)
根据此堆栈溢出帖子的建议:JSON.stringify,避免 TypeError:将循环结构转换为 JSON
我尝试flatted
通过添加以下导入来使用 npm库:
const { stringify } = require('flatted/cjs');
Run Code Online (Sandbox Code Playgroud)
并在我的回应之前进行字符串化:
res.send(stringify(scratchResponse));
Run Code Online (Sandbox Code Playgroud)
但是似乎正在删除一些对客户端至关重要的信息(客户端中断并说它缺少属性)。
是否可以直接发送我从 API 收到的响应?
我正在尝试将firebase连接到John Papa的angular2英雄之旅教程,我无法弄清楚如何去做.
我试着遵循和执行他的angular2例如jeffbcross 这里,但我不能完全得到它的工作.我正在尝试创建一个简单的angular2和firebase一起玩的例子,如果它包含OAuth,它会非常酷.有谁知道如何挂钩或有这个回购?
在尝试使用jeffbcross的例子之后,我被困在这里:github.com/LukeSchlangen/heroesOfFirebase我无法获得所有引用和导入工作.具体来说,import * as Firebase from 'firebase';
会继续显示我有'firebase'
未定义,这是有道理的,因为我从未导出它,但我不知道在哪里导出它.
(如果它有帮助,我使用的是Visual Studio Code,确切的错误是"找不到模块'firebase'")
几年前,我将此URL公开,以作为检索数据的一种方法。昨天在工作。今天,我的网站由于依赖于此数据而崩溃,但如果我尝试以编程方式(通过axios)检索它,则google现在返回500错误。
我还创建了一个代码沙盒,并用react来演示:https ://codesandbox.io/embed/xjmy9vl2z4
但是,如果登录,我仍然可以在浏览器中查看响应。
Google最近是否更改了其API,以便不再可以这种方式检索数据?有没有一种方法可以配置我的axios请求以继续检索此数据?
更新:
在此处跟踪问题:https : //issuetracker.google.com/issues/131613284
根据支持团队的说法:“工程团队认为他们已经找到了问题的根源,并且正在回滚到以前的版本以解决问题。请稍候。”
https://issuetracker.google.com/issues/131613284#comment109
更新:
回滚到以前的版本似乎已解决了该问题。我不再遇到这些问题。上面的链接和代码沙箱示例均正常运行。阅读该论坛,似乎其他人也不再遇到问题。如果您仍然遇到问题,我建议您再开一个(也许更具体的)帖子或问题。
直到昨天我们才收到任何这些错误.现在看来我们的一些用户在尝试登录我们的网站时收到以下控制台错误:
https://our-app.firebaseio.com/.lp?start=t&ser=67786327&cb=1&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=65618729&cb=2&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=32392592&cb=3&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=32634599&cb=4&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=4599472&cb=5&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=83620720&cb=6&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=50746401&cb=7&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=52157056&cb=8&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=53706052&cb=9&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
https://our-app.firebaseio.com/.lp?start=t&ser=82867820&cb=10&v=5 Failed to load resource: net::ERR_CONNECTION_REFUSED
login:1 Mixed Content: The page at 'https://app.oursite.io/login' was loaded over HTTPS, but requested an insecure resource 'http://app.oursite.io/#!/login'. This content …
Run Code Online (Sandbox Code Playgroud) 我正在尝试测试特定路线的行为。即使我创建存根,它也会继续运行中间件。我希望事件认证暂时通过。我了解到,这并不是真正的“单元”测试。我快到那里了。我还简化了代码。这是要测试的代码:
const { rejectUnauthenticated } = require('../modules/event-authentication.middleware');
router.get('/event', rejectUnauthenticated, (req, res) => {
res.sendStatus(200);
});
Run Code Online (Sandbox Code Playgroud)
这是我要跳过的中间件:
const rejectUnauthenticated = async (req, res, next) => {
const { secretKey } = req.query;
if (secretKey) {
next();
} else {
res.status(403).send('Forbidden. Must include Secret Key for Event.');
}
};
module.exports = {
rejectUnauthenticated,
};
Run Code Online (Sandbox Code Playgroud)
测试文件:
const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
let app;
const authenticationMiddleware = require('../server/modules/event-authentication.middleware');
const { expect } = chai;
chai.use(chaiHttp);
describe('with correct …
Run Code Online (Sandbox Code Playgroud) 目前,我正在通过输入foreman start
命令行来运行我的解决方案,并且运行良好。我正在尝试使用 Visual Studio 代码调试我的代码。为此,我创建了一个 launch.json 文件:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "node",
"request": "launch",
"program": "${workspaceRoot}/package.json",
"stopOnEntry": false,
"args": [],
"cwd": "${workspaceRoot}",
"preLaunchTask": "start",
"runtimeExecutable": null,
"runtimeArgs": [
"--nolazy"
],
"env": {
"NODE_ENV": "development"
},
"externalConsole": false,
"sourceMaps": false,
"outDir": null
},
{
"name": "Attach",
"type": "node",
"request": "attach",
"port": 5858,
"address": "localhost",
"restart": false,
"sourceMaps": false,
"outDir": null,
"localRoot": "${workspaceRoot}",
"remoteRoot": null
}
]
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个 tasks.json 文件来尝试从那一点启动程序:
{
"version": "0.1.0",
"command": …
Run Code Online (Sandbox Code Playgroud) 我有一个正常运行的 redux 传奇,但我无法停止思考它看起来有多丑。无可否认,我试图做的是在不需要它的情况下模拟异步,但我想延迟一秒钟然后调用另一个函数 -类似于教程。与教程(这是一个简单的增量器)的不同之处在于我实际上需要传递信息。这是我的做法:
import { delay } from 'redux-saga';
import { put, call, takeEvery, all } from 'redux-saga/effects';
// Our worker Saga: will perform the add employee task
export function* addEmployeeAsync(action) {
yield call(delay, 1000);
console.log(action); // logs undefined on initial app load
const payload = action && action.payload;
yield put({ type: 'ADD_EMPLOYEE', payload });
}
// Our watcher Saga: spawn a new addEmployeeAsync task on each ADD_EMPLOYEE_ASYNC
export function* watchAddEmployeeAsync() {
yield takeEvery('ADD_EMPLOYEE_ASYNC', addEmployeeAsync);
}
export …
Run Code Online (Sandbox Code Playgroud) node.js ×5
firebase ×4
angularfire ×2
angular ×1
axios ×1
chai ×1
express ×1
foreman ×1
heroku ×1
javascript ×1
mocha.js ×1
pg ×1
reactjs ×1
redux ×1
redux-saga ×1
sinon ×1
unit-testing ×1