firebase-toolsïŒ 7.0.2
ãã©ãããã©ãŒã ïŒ Oracle Linux Server 7.6ãããŒã10.15
httpsé¢æ°ããfirebase-adminãïŒã^ 8.2.0ãããfirebase-functionsãïŒã^ 3.0.2ãã§ãšãã¥ã¬ãŒãããŸã
Firebaseé¢æ°ã䜿çšããŠhttpsé¢æ°ãå®è¡ããŸãïŒshell
ãšã©ãŒãªãïŒfirebase-tools 7.0.0ã¯ãšã©ãŒãã¹ããŒããŸããïŒ
æ©èœãããªã¯ãšã¹ããéä¿¡ããŸããã
firebase > â Error: The incoming JSON object does not contain a client_email field
at JWT.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
at GoogleAuth.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
at GoogleAuth.getClient (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
at GrpcClient._getCredentials (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:107:40)
at GrpcClient.createStub (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:223:34)
at new FirestoreClient (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
at ClientPool.acquire (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
at ClientPool.run (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
at Firestore.request (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:957:33)
â Your function was killed because it raised an unhandled error.
é¢é£ããstackoverflowã®æçš¿ïŒ https ïŒ
@noelmansourããããšã7.0.1
ãš7.0.2
éã®äœãããããåŒãèµ·ãããããã§ããç§ã¯å ããããå€æŽãèŠãŠãããŸãã
ãã®ãšã©ãŒã¯ãã®ã©ã€ãã©ãªããæ¥ãŠããããã§ãïŒ https ïŒ
7.0.2以éããã®åé¡ãçºçããŠããŸã
7.0.2ã«ã¢ããã°ã¬ãŒãããã°ããã§ãããã確èªã§ããŸãã ã¢ã«ãŠã³ãã®è³æ Œæ
å ±ã確èªããŸãããã client_email
ãã£ãŒã«ãã衚瀺ãããŠããŸãã
ãã®ãšã©ãŒã§å€±æãããšãã¥ã¬ãŒã¿ãŒã§å®è¡ããããšããŠããé¢æ°ã®ã³ãŒãã誰ããå ±æã§ããŸããïŒ ã·ã³ãã«ã§ããã»ã©è¯ãã
@samtstern次ã®ã³ãŒãã¯ç§ã«ãšã£ãŠå€±æããŸãïŒ
import * as admin from 'firebase-admin';
admin.initializeApp();
import * as functions from 'firebase-functions';
export const testFunction = functions.https.onRequest(async (req, res) => {
const request = await admin.firestore().doc('test/123').get();
return request.ref.set({ test: 'random' })
.then(() => res.send('ok!'))
.catch((err) => res.status(500).send('error'));
});
admin.initializeApp()
åŒã³åºããšãã«ãµãŒãã¹ã¢ã«ãŠã³ããèšå®ããå Žåã«ã®ã¿æ©èœããŸãïŒ
// this works
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
@wceolinããããšã
$ npm list @google-cloud/firestore
ããã¯ç§ã®çµæã§ãïŒãããŠãã¹ãŠãç§ã®ããã«åããŸãïŒïŒ
functions@ /tmp/tmp.ZkMEM0XGPF/functions
ââ⬠[email protected]
âââ @google-cloud/[email protected]
ç§ã¯åãçµæãåŸãŸããïŒð€
ã ããç§ã¯ãšã©ãŒã¹ã¿ãã¯ãã¬ãŒã¹ãäžã£ãŠãã®é¢æ°ã§æ©ããŠããŸãïŒ
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141
ãã®åå²ããããŸãïŒ
async _getCredentials(opts: ClientStubOptions) {
if (opts.sslCreds) {
return opts.sslCreds;
}
const grpc = this.grpc;
const sslCreds = grpc.credentials.createSsl();
const client = await this.auth.getClient();
const credentials = grpc.credentials.combineChannelCredentials(
sslCreds,
grpc.credentials.createFromGoogleCredential(client)
);
return credentials;
}
ç§ã®ã³ãŒãã§ã¯opts.sslCreds
ãå®çŸ©ãããŠããã®ã§ã次ã®ãã©ã³ãã«ã¢ã¯ã»ã¹ããŸãã
if (opts.sslCreds) {
return opts.sslCreds;
}
è³æ Œæ å ±ãçµã¿ç«ãŠãããšããŠåé¡ãåŒãèµ·ããã®ã¯ããã1ã€ã®ãã©ã³ãã§ãã ããã§ãç§ã®ã³ãŒããäžæ¹åã«é²ã¿ãããªãã®ã³ãŒããå¥ã®æ¹åã«é²ãçç±ãç解ããå¿ èŠããããŸãã
@wceolinã¯ããªãã«éããå¯èœæ§ãnode_modules
ãã©ã«ãããã³ç·šéãã®ãã¡ã€ã«functions/node_modules/google-gax/build/src/grpc.js
æã€ããã«console.log()
å°å·ããŠããoptions
ã§ãªããžã§ã¯ããcreateStub
é¢æ°ã䜿çšããŠã衚瀺å
容ãæããŠãã ããã
ãããŸã§ã®ãååããããšãããããŸãïŒ
@samtsternããã圹ç«ã€ãã©ããã¯
npm list @google-cloud/firestore
åºåã¯ããªãã®åºåãšäžèŽããŸãã
ç§ã¯é±æ«ã«node_modulesãã£ã¬ã¯ããªãåé€ããã®ã§ããããé¢ä¿ããŠããã®ã ããããšæããŸãã
@noelmansourãã®ã¡ã¢ã«æè¬ããã¯ãªãŒã³ãªã»ããã¢ããã§åçŸã§ããªãçç±ã説æããŸãã
@noelmansour node_modules
ã yarn.lock
ãåé€ããŠãäŸåé¢ä¿ãåé€ããããšããŸããããããŸããããŸããã§ããã ãããžã§ã¯ããæåããäœæããŠãäœãèµ·ãããã確èªããŸãã
@noelmansourããã¯ç§ãoptions
ãªããžã§ã¯ãããåŸããã®ã§ãïŒ
{
"clientConfig": {},
"port":443,
"servicePath":"firestore.googleapis.com",
"credentials":{},
"projectId":"my-test-project",
"firebaseVersion":"8.2.0",
"libName":"gccl",
"libVersion":"2.2.3 fire/8.2.0",
"scopes":[
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/datastore"
]
}
@wceolinããããšãéåžžã«åœ¹ç«ã¡ãŸãã
{
"clientConfig":{},
"port":8080,
"servicePath":"localhost",
"credentials":{},
"projectId":"fir-dumpster",
"firebaseVersion":"8.2.0",
"libName":"gccl",
"libVersion":"2.2.3 fire/8.2.0",
"service":"firestore.googleapis.com",
"sslCreds":{
"callCredentials": {}
},
"customHeaders":{
"Authorization":"Bearer owner"
},
"scopes":[
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/datastore"
]
}
ã芧ã®ãšãããã¯ã©ã€ã¢ã³ãã¯ãŸã æ¬çªç°å¢ã«ã¢ã¯ã»ã¹ããããšããŠããŸãããé¢æ°ãšãã¥ã¬ãŒã¿ãŒãã¢ã¯ã»ã¹ãèš±å¯ãããŠããªãããã«å€±æããŸãã
ãã¡ã€ã€ãŒã¹ãã¢ãšãã¥ã¬ãŒã¿ãŒãå®è¡ããŠããŸããïŒ ãã¡ã€ã€ãŒã¹ãã¢ãšãã¥ã¬ãŒã¿ãŒã«æžã蟌ãããšãç®æšãšããŠããŸããããããšãå®éã«æ¬çªãã¡ã€ã€ãŒã¹ãã¢ã«æžã蟌ã¿ããã§ããïŒ
ãããç§ã¯ã€ãã«ãããåçŸããããšãã§ããŸããïŒ firebase emulators:start --only functions
ãå®è¡ãããšãFirestoreã«æžã蟌ãããšãããšããã®ãšã©ãŒãçºçããŸãã
ãã®ãã°ã¡ãã»ãŒãžã衚瀺ãããŸãïŒ
â The Cloud Firestore emulator is not running so database operations will fail with a 'default credentials' error.
ããã¯ãã¯ãæ£ç¢ºã«ã¯æ£ãããããŸãããïŒãšã©ãŒã¯client_emailã«é¢ãããã®ã§ãïŒãæ€åºã¯äŸç¶ãšããŠæ£ããã§ãã ããã«ããä»ã®äººããã®èŠåãèŠãŠããŸããïŒ
ããã«åœ¹ç«ã€ãããããªãããã€ãã®ããå€ãã®æ å ±ããããŸãã é±æ«ã«ã.zshrcã§firestoreãšãã¥ã¬ãŒã¿ãŒã®ç°å¢å€æ°ãæ瀺çã«èšå®ããŸããã
export FIRESTORE_EMULATOR_HOST="localhost:8080"
åé€ãããšãšã©ãŒãçºçããŸãã ãããŠãããã¯ã³ãã³ãfirebase emulators:start
@noelmansour --debug
ã䜿çšããŠãã®ã³ãã³ããå®è¡ããããã«ãã°ãtxt
ãã¡ã€ã«ãšããŠæ·»ä»ã§ããŸããïŒ
@samtsternæã ããšãã¥ã¬ãŒã¿ã䜿çšããŠHTTPé¢æ°ãããŒã«ã«ã§æäŸãã
firebase serve --only functions --project myProjectAlias
ããããã®ããã«æ©èœããã¯ãã ã£ããã©ããã¯ããããŸãããïŒæ¬çªç°å¢ã«ããŒã¿ãæžã蟌ãããšãã§ããŸãïŒã以åã¯æ©èœããŠããŸããã ð
@wceolin 6.8.0
以éã®ããŒãžã§ã³ã§ã¯ã裞ã®initializeApp()
ã§ã¯ãã®ããã«æ©èœããã¯ãããããŸãã6.8.0
ã ç§ã«ããã®ãŠãŒã¹ã±ãŒã¹ããããŸãããããã©ã«ãã§æ¬çªç°å¢ãä¿è·ããããã«ããã®ãªããã€ã³ãäœæããæ¹æ³ãèŠã€ããããšèããŠããŸãã
ããããç§ã¯ãã®ãšã©ãŒãä»ã©ãããæ¥ãã®ããç¥ã£ãŠããããã§ãïŒ
@samtstern確èªã®ããã«ã FIRESTORE_EMULATOR_HOST
ãèšå®ããã«firebase emulators:start --debug
ãå®è¡ããŸãã
æ£ããïŒ
æã2019幎7æ1æ¥ã«ã¯ãåå12æ28åPMããšã«ãã³ã¹ãŒã«ã®[email protected]ã¯æžããŸããïŒ
@samtstern https://github.com/samtstern確èªã®ããã firebaseãå®è¡ããŸã
ãšãã¥ã¬ãŒã¿ãŒïŒstart-- FIRESTORE_EMULATOR_HOSTãèšå®ãããŠããªããããã°ãæ£ããã§ããïŒâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
ã
ããã«ãããŸãã
åèãŸã§ã«ããã®è¡ãããããžã§ã¯ãIDãåé€ããŸããïŒéèŠã§ã¯ãªããšæããŸãïŒã
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig
ãŸããenvå€æ°ããšã¯ã¹ããŒãããã«ã firebase-tools @ 7.0.1ã§æ¬¡ã®ãšã©ãŒãçºçããŸãã
â Error: Getting metadata from plugin failed with error: Header field "authorization" must have only a single value
at Http2CallStream.call.on (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call.js:68:41)
at emitOne (events.js:121:20)
at Http2CallStream.emit (events.js:211:7)
at process.nextTick (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
at _combinedTickCallback (internal/process/next_tick.js:132:7)
at process._tickCallback (internal/process/next_tick.js:181:9)
â Your function was killed because it raised an unhandled error.
ãããã®ãã°ãããããšã@noelmansour ã é¢æ°ã³ãŒãã衚瀺ããŠããã ããŸãããïŒ
ãã¹ãŠã®é¢æ°ãå ±æããããªãã®ã§å°ã泚æãå¿ èŠã§ããä»ã®ãšãããããããšã©ãŒãåçŸããããšã確èªããæéããããŸããããå®è¡ããŠããhelloé¢æ°ã¯æ¬¡ã®ãšããã§ãã
index.tsïŒ
require('./common'); // this should always be first in this file
export * from './debug'
// other exports for other functions
common.tsïŒ
import * as admin from 'firebase-admin';
export const app = admin.initializeApp();
debug.tsïŒ
import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
import {app} from "./common";
export const hello = functions.https.onRequest(async (req, resp) => {
const firestore = app.firestore();
const users = await firestore.collection('users').get();
console.log('empty users collection? ' + users.empty);
resp.sendStatus(200);
});
package.jsonïŒ
{
"name": "functions",
"scripts": {
"lint": "tslint --project tsconfig.json",
"build": "tsc",
"serve": "npm run build && firebase serve --only functions",
"shell": "npm run build && firebase functions:shell",
"emulators": "npm run build && firebase emulators:start",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "8"
},
"main": "lib/index.js",
"dependencies": {
"@google-cloud/tasks": "^1.1.0",
"@types/jsonwebtoken": "^8.3.2",
"@types/request-promise": "^4.1.42",
"firebase-admin": "^8.2.0",
"firebase-functions": "^3.0.2",
"request": "^2.88.0",
"request-promise": "^4.2.4"
},
"devDependencies": {
"tslint": "^5.12.0",
"typescript": "^3.2.2"
},
"private": true
}
@noelmansourããããšãããããŸãïŒ ããã¯ã¡ããã©ç§ã«ãã°ãæããã«ããŸããã ããã2ã€ã®ããšã¯åäžã§ããå¿ èŠããããŸãããããã§ã¯ãããŸããã
ãªãã·ã§ã³1
admin.initializeApp();
const firestore = admin.firestore();
ãªãã·ã§ã³2
const app = admin.initializeApp();
const firestore = app.firestore();
ãããããã¯ç§ã®ããã«ãããä¿®æ£ããŸããã ããããšãïŒ
Error: The incoming JSON object does not contain a client_email field
ãšã©ãŒãçºçããŠããŸãã ä¿®æ£ã§ããŸããã§ããã
ããã©ã«ãã³ãŒãïŒ
import { initializeApp } from 'firebase-admin';
// Initiate Firebase app
export const app = initializeApp();
export const db = app.firestore();
export const auth = app.auth();
å¥ã®è©Šã¿ïŒ
import { initializeApp, firestore, auth as defAuth } from 'firebase-admin';
// Initiate Firebase app
export const app = initializeApp();
export const db = firestore();
export const auth = defAuth();
å¥ã®è©Šã¿ïŒ
import * as admin from 'firebase-admin';
// Initiate Firebase app
export const app = admin.initializeApp();
export const db = admin.firestore();
export const auth = admin.auth();
@JFGHTãšãã¥ã¬ãŒã¿ãŒãå®è¡ããããã«ã©ã®ã³ãã³ãã䜿çšããŠããŸããïŒ --debug
ãã©ã°ã䜿çšããŠãã³ãã³ããšãã®å®è¡ã®ãã°ã衚瀺ã§ããŸããïŒ
_å 責äºé ïŒç§ã®åé¡ãããã§ããã«ã©ã®çšåºŠé¢é£ããŠãããã¯ããããŸããããå°ãªããšããäžéšã®äººã«åœ¹ç«ã€å¯èœæ§ããããããããã«æ å ±ãããããã§ããŸãã_
FirestoreããŒã¿ããŒã¹å ã®ããã¥ã¡ã³ãããããã§æŽæ°ããããšããfirebaseé¢æ°ã«ãåãããšããããŸããã ïŒããããªãã§ãã¹ãããŸããã§ããïŒã
ããã¯ã³ãŒã«ã¹ã¿ãã¯ã§ãïŒ
Unhandled error Error: The incoming JSON object does not contain a client_email field
> at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
> at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
> at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
> at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
> at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
> at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
> at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
> at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
> at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
> at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)
RESPONSE RECEIVED FROM FUNCTION: 500, {
"error": {
"status": "INTERNAL",
"message": "INTERNAL"
}
}
ã³ãã³ãã©ã€ã³ã䜿çšããŠããŒã«ã«ã§é¢æ°ãå®è¡ããŠããŸããã
firebase functions:shell
ç§ã¯ãã®ã³ãŒãã䜿çšããŠããŸããïŒ
// Reference report in Firestore
const db = admin.firestore();
admin.initializeApp();
export const performMyCallableFirebaseFunction = (db,, { from, to }) => {
return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));
const batch = db.batch();
snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));
return batch.commit();
});
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));
è¡ãå€æŽããŸããadmin.initializeApp();
ã«admin.initializeApp({ credential: admin.credential.applicationDefault() });
ãããŠä»ãç§ã¯èªåã®é¢æ°ãããŒã«ã«ã§åŒã³åºãããšãã§ããŸããïŒ
firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})
admin.credential.applicationDefaultïŒïŒã«ã€ããŠã¯ããã¥ã¡ã³ããåç §ããŠãã ãã
@samtstern
concurrently --kill-others 'GOOGLE_APPLICATION_CREDENTIALS=service-account.json firebase serve --only functions' 'tsc --project ./ --watch'
ãã°ã«é¢ããŠã¯ãä»æ¥ã¯ã§ããŸãããããããªããïŒ
è¡ãå€æŽããŸãã
admin.initializeApp();
ã«admin.initializeApp({ credential: admin.credential.applicationDefault() });
ããã¯ç§ã®ããã«åããã ç§ã¯ä»¥äžãä»ããŠããŒã«ã«ã§é¢æ°ãå®è¡ããŠããŸãïŒ
firebase serve --only functions
ãããæ¬çªç°å¢ã§å®å šãã©ããã¯ç§ã«ã¯ããããŸããã ããã¥ã¡ã³ãããã¯ãæ¬çªç°å¢ã§å®è¡ãããŠããã³ãŒãã«ç®¡çè ãã¢ã¯ã»ã¹ã§ããããã«æãããŸããããšã«ããããã§ãã
@ ralphsmith80ããããªãã¯ããããæ£ããã§ãïŒ
è³æ Œæ å ±ãèªåçã«èŠã€ãã
GCPã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªã¯ãApplication Default CredentialsïŒADCïŒãšåŒã°ããæŠç¥ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®èªèšŒæ å ±ãæ€çŽ¢ããŸãã ã³ãŒãã§ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªã䜿çšããå Žåãã¹ãã©ããžãŒã¯æ¬¡ã®é åºã§è³æ Œæ å ±ããã§ãã¯ããŸãã
ãŸããADCã¯ç°å¢å€æ°GOOGLE_APPLICATION_CREDENTIALSãèšå®ãããŠãããã©ããã確èªããŸãã å€æ°ãèšå®ãããŠããå ŽåãADCã¯å€æ°ãæããµãŒãã¹ã¢ã«ãŠã³ããã¡ã€ã«ã䜿çšããŸãã 次ã®ã»ã¯ã·ã§ã³ã§ã¯ãç°å¢å€æ°ãèšå®ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ç°å¢å€æ°ãèšå®ãããŠããªãå ŽåãADCã¯ãCompute EngineãKubernetes EngineãApp Engineãããã³Cloud FunctionsãæäŸããããã©ã«ãã®ãµãŒãã¹ã¢ã«ãŠã³ããããããã®ãµãŒãã¹ã§å®è¡ãããã¢ããªã±ãŒã·ã§ã³ã«äœ¿çšããŸãã
ADCãäžèšã®è³æ Œæ å ±ã®ãããã䜿çšã§ããªãå Žåããšã©ãŒãçºçããŸãã
ãã®æŠç¥ã¯ããã¹ããå®éšã®éã«åœ¹ç«ã¡ãŸãããã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããè³æ Œæ å ±ãå€å¥ããã®ãé£ãããªãå¯èœæ§ããããŸãã
åºå žïŒ https ïŒ
è¡ãå€æŽããŸãã
admin.initializeApp();
ã«admin.initializeApp({ credential: admin.credential.applicationDefault() });
ãã®ã¡ãœããã¯ããŸã£ããæ°ãããšã©ãŒãäœæããŸãã
Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
at GoogleAuth.getApplicationDefaultAsync (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
at process._tickCallback (internal/process/next_tick.js:68:7)
ïŒ1454ã§è¿°ã¹ãããã«ãç§ãã¹ãã¢ãåæåããŠããŸã
admin.initializeApp();
const db = admin.firestore();
initializeApp
ã«è³æ Œæ
å ±ãè¿œå ãããšãäžèšã®ãšã©ãŒãçºçããŸãã
ããããªããã°ãç§ã¯ãŸã åŸãŠããŸãã
Error: The incoming JSON object does not contain a client_email field
at JWT.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
at GoogleAuth.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
at GoogleAuth.getClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
at GrpcClient._getCredentials (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:107:40)
at GrpcClient.createStub (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:223:34)
at new FirestoreClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
at ClientPool.acquire (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
at ClientPool.run (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
at Firestore.readStream (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:995:26)
åºæ¬çãªãã¥ãŒããªã¢ã«ïŒãã¥ãŒããªã¢ã«ã¯2019幎6æããïŒã§ãããšåããšã©ãŒãçºçããããããã®ãšã©ãŒã¯ããªãæ°ããããã«èŠããŸã...
INDEX.JSïŒ
`` `const Functions = requireïŒ 'firebase-functions'ïŒ;
const admin = requireïŒ 'firebase-admin'ïŒ;
admin.initializeAppïŒïŒ;
admin.firestore()
.collection('screams')
.add(newScream)
.then(doc => {
res.json({message: `document ${doc.id} created successfully`});
})
.catch(err => {
res.status(500).json({ error: 'oops, something went wrong'});
console.error(err);
});
}ïŒ;
Postmanã§ãšã³ããã€ã³ããå®è¡ãããšããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸã
ããšã©ãŒãïŒããã£ãšãäœããããŸããããªãã£ãã
ã³ã³ãœãŒã«ã«æ¬¡ã®ããã«èšèŒãããŠããŸãã
æ©èœïŒãcreateScreamãã®å®è¡ãéå§
ãšã©ãŒïŒåä¿¡JSONãªããžã§ã¯ãã«client_emailãã£ãŒã«ããå«ãŸããŠããŸãã
ãã¥ãŒããªã¢ã«ã¯FreeCodeCampããã®ãã®ã§ã-https ïŒ//www.youtube.com/watchïŒv = m_u6P5k0vP0
Firebaseã³ã³ãœãŒã«>èšå®ïŒæ¯è»ã®ã¢ã€ã³ã³ïŒ>ãŠãŒã¶ãŒãšæš©é>ãµãŒãã¹ã¢ã«ãŠã³ã
æ°ããããŒãçæããŸãã
jsonããããžã§ã¯ããã©ã«ããŒã«è¿œå ããŸãã
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://lts-profile.firebaseio.com"
});
ãµãŒãã¹ã¢ã«ãŠã³ãã®jsonãã¡ã€ã«ã䜿çšãããšãFirebaseã®ãµãŒãã¹ãšæ©èœããããžã§ã¯ãã§å©çšã§ããããã«ãªããŸãã
åžžã«ãã©ã€ããŒãã«ããå¿
èŠããããŸãã .gitignoreã«ãã¡ã€ã«ãã€ã³ã¯ã«ãŒãããŸã
Firebaseã³ã³ãœãŒã«>èšå®ïŒæ¯è»ã®ã¢ã€ã³ã³ïŒ>ãŠãŒã¶ãŒãšæš©é>ãµãŒãã¹ã¢ã«ãŠã³ã
æ°ããããŒãçæããŸãã
jsonããããžã§ã¯ããã©ã«ããŒã«è¿œå ããŸãã
var admin = require("firebase-admin"); var serviceAccount = require("path/to/serviceAccountKey.json"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: "https://lts-profile.firebaseio.com" });
ãµãŒãã¹ã¢ã«ãŠã³ãã®jsonãã¡ã€ã«ã䜿çšãããšãFirebaseã®ãµãŒãã¹ãšæ©èœããããžã§ã¯ãã§å©çšã§ããããã«ãªããŸãã
åžžã«ãã©ã€ããŒãã«ããå¿ èŠããããŸãã .gitignoreã«ãã¡ã€ã«ãã€ã³ã¯ã«ãŒãããŸã
ããããšãphtnãæè¬-ç§ã¯ããªãã®æ瀺ã«åŸããŸããããä»ã¯ãšã©ãŒãçºçããŸã
Error: Error occurred while parsing your function triggers.
å¥åŠãªããšã«ã ã httpsïŒ//europe-west1-myapp.cloudfunctions.net/api / ...-ããŒã«ã«ãã¹ãã§ã¯ãããŸãããïŒ
ããã2ã€ã®å¿çã®çµã¿åãããæ©èœããŸããïŒ å©ããŠãããŠããããšãã
serviceAccountKey.jsonã¯/functions
ãã£ã¬ã¯ããªã«ããå¿
èŠããããŸãã
firebase deploy --only functions
ã¯ãå€ã«ãããšæå¥ãèšããŸãã
ããäžåºŠããããšãïŒãšãŠãèŸæ±åŒ·ãããŠãããŠïŒïŒã ç§ã®serviceAccountKey.jsonã¯/ functionsãã©ã«ããŒã«ãããŸãïŒä»¥äžã®ãªã³ã¯ã®ã¹ã¯ãªãŒã³ã·ã§ãããåç §ããŠãã ããïŒã
initilizeAppã«ã¯3ã€ã®æ¹æ³ãããããã§ã...ããã3ã€ãã¹ãŠãåå¥ã«è©ŠããŸããããã©ããæ©èœããŠããªãããã§ããããã¯ãç§ãèŠéããŠããåçŽãªãã®ã«ãªããšæããŠããŸãã
D
ã¹ã¯ãªãŒã³ã°ã©ãïŒ
ç§ãã¡ã®åŽã§ãåãåé¡ãçºçããŠããŸãã ãã®ã¢ãã«ã§FirebaseãåæåããŠããŸãïŒ
const firebaseInstance = admin.initializeAppïŒïŒ
const firestoreInstance = firebaseInstance.firestoreïŒïŒ
ããã远跡ããã®ã«åœ¹ç«ã€äœããæäŸã§ãããã©ããæããŠãã ããã
ãã®ã¹ã¬ããã®å šå¡ã ç§ãã¡ã¯è§£æ±ºçãçºèŠããŸããã firebase-toolsã7.0.2ãã7.0.1ã«ããŠã³ã°ã¬ãŒããããŸã£ããç°ãªããšã©ãŒïŒããã©ã«ãã®èªèšŒæ å ±ãèªã¿èŸŒããªãããšã«é¢ããåé¡ïŒãåãåããŸããã
ã ããç§ãã¡ã¯èµ°ãç¶ããŸããïŒ
gcloud auth application-default login
ããã§åé¡ãä¿®æ£ãããŸãã
@ryanhornbergerã¯ã次ã®ããã«ããŠåé¡ãåé¿ã§ããŸãã
const firebaseInstance = admin.initializeApp()
const firestoreInstance = admin.firestore() // I changed this line
ïŒ1459ã§æ¥ãä¿®æ£ããããŸã
@samtsternããããšãããããŸãïŒ
ãã®ã¹ã¬ããã®å šå¡ã ç§ãã¡ã¯è§£æ±ºçãçºèŠããŸããã firebase-toolsã7.0.2ãã7.0.1ã«ããŠã³ã°ã¬ãŒããããŸã£ããç°ãªããšã©ãŒïŒããã©ã«ãã®èªèšŒæ å ±ãèªã¿èŸŒããªãããšã«é¢ããåé¡ïŒãåãåããŸããã
ã ããç§ãã¡ã¯èµ°ãç¶ããŸããïŒ
gcloud auth application-default login
ããã§åé¡ãä¿®æ£ãããŸãã
ããã¯ç§ã«ãšã£ãŠã¯ããŸããããŸãã æåã«firebase-toolsã7.1ã«ã¢ããã°ã¬ãŒãããŸããããããŒã«ã«ã§ãfirebaseserveããå®è¡ãããšãåããšã©ãŒããçºçããŸããã ãã ããFirebaseã«ãããã€ããå Žåã¯æ£åžžã«æ©èœããŠããŸãã 7.0.1ã«ããŠã³ã°ã¬ãŒããããšãããŒã«ã«ã§åäœããŸãã
7.1ãšåãåé¡
çŸåšä¿®æ£ã«åãçµãã§ããŸããããŸã æºåãã§ããŠããŸããã
https://github.com/firebase/firebase-tools/pull/1479
ç§ã¯ããã§ç«ã¡åŸçããŠããŸããã©ãã«ãããŠãã ããïŒ
7.0.1ã«ããŠã³ã°ã¬ãŒãããŠã圹ã«ç«ã¡ãŸããã§ãã
ããã«å¯Ÿããä¿®æ£ã¯ïŒ1479ã«ããŒãžããã次ã®ãªãªãŒã¹ã«å«ãŸããäºå®ã§ãïŒã€ãŸãã 7.2.0
ïŒ
ãã@samtstern ããããç§ãééã£ãŠããããšãªã®ãããããšãããã€ãã®æ°ããåé¡ãªã®ãã¯
ãŸãã firebase emulators:exec "npm run test"
å®è¡ãããšã次ã®èŠåã衚瀺ãããŸãã
â The Cloud Firestore emulator is not running, so calls to Firestore will affect production.
ã³ãã³ãã®ååã§ããšãã¥ã¬ãŒã¿ãŒãèµ·åããããšãããããŸãã
~/d/s/functions â¯â¯â¯ firebase emulators:exec "npm run test" â 130
i Starting emulators: ["functions","firestore"]
â functions: Using node<strong i="12">@8</strong> from host.
â functions: Emulator started at http://localhost:5001
i firestore: Logging to firestore-debug.log
â firestore: Emulator started at http://localhost:8080
i firestore: For testing set FIRESTORE_EMULATOR_HOST=localhost:8080
å®éã«ã¯ãæ¬çªã®FirestoreDBãæŽæ°ããŠããããã§ã¯ãããŸããã å€åãã ã®åœé°æ§ïŒ
ãã1ã€ã®åé¡ã¯ããŸã ãšã©ãŒãçºçããŠããããšã§ãã $GOOGLE_APPLICATION_CREDENTIALS
èšå®ããŸããhttps ïŒ//firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optionalã«ãããšãfirestoreã«ã¢ã¯ã»ã¹ããã ãã®å Žåã¯ããã§ã«ååãªæš©éãããã¯ãã§ãã
CloudFirestoreããã³RealtimeDatabaseããªã¬ãŒã«ã¯ãã§ã«ååãªèªèšŒæ å ±ããããè¿œå ã®ã»ããã¢ããã¯å¿ èŠãããŸããã
admin.initializeApp();
ã䜿çšããŠããã©ã¡ãŒã¿ãŒãªãã§admin sdkãåæåããŠããŸãããããããééã£ãŠããããšããããŸããïŒ
@noelmansourãããå ±åããŠãããŠããããšãïŒãããŠmaster
è©ŠããŠãããŠããããšãïŒïŒã¡ã€ã³é¢æ°ãã¡ã€ã«ã®ã³ãŒãã衚瀺ã§ããŸããïŒ
ã»ãŒééããªããã©ãŒã«ã¹ãã¬ãã£ãã§ãããä¿®æ£ããå¿ èŠã®ããéèŠãªãã®ã§ãã
ä»ã®ãã¡ã€ã«ãããšã¯ã¹ããŒãããã ããªã®ã§ãéåžžã«æå°éã§ãã
import * as admin from 'firebase-admin';
// this should happen before any function runs
admin.initializeApp();
export * from './authFunctions';
export * from './fitbit';
export * from './sleep'
export * from './scheduler';
export * from './debug'
export {scheduleFunction} from "./scheduler";
å®éãããã¯ç§ã®ãã¹ãèšå®ã®åé¡ã®ããã§ãã firebase emulators:start
ãå®è¡ããŠãããšããèŠåã¯è¡šç€ºãããŸããã
@noelmansourããªãã®ãã¹ãã¯ã©ã®ããã«èŠããŸããïŒ ãŸãããã®ã¹ã¬ããã§å šå¡ã«ã¹ãã ãéä¿¡ããªãããã«ãããã«ã€ããŠè©±ãåãããã«æ°ããåé¡ãæåºããŠããã ããŸããã>
ã¯ãããã¡ããã è¬çœªããããŸãã ïŒ1530ãªãŒãã³
ãã®ã¹ã¬ããã®å šå¡ã ç§ãã¡ã¯è§£æ±ºçãçºèŠããŸããã firebase-toolsã7.0.2ãã7.0.1ã«ããŠã³ã°ã¬ãŒããããŸã£ããç°ãªããšã©ãŒïŒããã©ã«ãã®èªèšŒæ å ±ãèªã¿èŸŒããªãããšã«é¢ããåé¡ïŒãåãåããŸããã
ã ããç§ãã¡ã¯èµ°ãç¶ããŸããïŒgcloud auth application-default login
ããã§åé¡ãä¿®æ£ãããŸãã
ããã¯ç§ã«ãšã£ãŠã¯ããŸããããŸãã æåã«firebase-toolsã7.1ã«ã¢ããã°ã¬ãŒãããŸããããããŒã«ã«ã§ãfirebaseserveããå®è¡ãããšãåããšã©ãŒããçºçããŸããã ãã ããFirebaseã«ãããã€ããå Žåã¯æ£åžžã«æ©èœããŠããŸãã 7.0.1ã«ããŠã³ã°ã¬ãŒããããšãããŒã«ã«ã§åäœããŸãã
FirebaseããŒãžã§ã³ãããŠã³ã°ã¬ãŒãããæ¹æ³ãæããŠããã ããŸããïŒ çŸåšã®ããŒãžã§ã³ã¯7.0.2ãªã®ã§ãnpm i [email protected] -gthisãã€ã³ã¹ããŒã«ããŠã¿ãŸããã ããã§ãç§ã®ããŒãžã§ã³ã¯7.0.2ã§ãã plsãã«ããããŠã³ã°ã¬ãŒãããæ¹æ³ã¯ïŒ
ãã®åé¡ã®å®å
šãªä¿®æ£ã¯7.2.0
ãªãªãŒã¹ãããŸããïŒ
npm install -g [email protected]
ãã®ããŒãžã§ã³ã§åæ§ã®ãã°ãåŒãç¶ãçºçããå Žåã¯ãæ°ããåé¡ãéããŠãã ããã
Firebaseé¢æ°ã§ãããšåãåé¡ãçºçããŸãã ãã§ã«npminstall -g [email protected]ãè©Šãããšãããåããšã©ãŒãçºçããŸããã
Firebaseé¢æ°ã§ãããšåãåé¡ãçºçããŸãã ãã§ã«npminstall -g [email protected]ãè©Šãããšãããåããšã©ãŒãçºçããŸããã
次ã®è§£æ±ºçã¯ç§ã®ããã«åããïŒ
// Create Firebase-adminsdk key
// Providing a service account object inline
admin.initializeApp({
credential: admin.credential.cert({
projectId: "<PROJECT_ID>",
clientEmail: "foo@<PROJECT_ID>.iam.gserviceaccount.com",
privateKey: "-----BEGIN PRIVATE KEY-----<KEY>-----END PRIVATE KEY-----\n"
})
});
æãåèã«ãªãã³ã¡ã³ã
_å 責äºé ïŒç§ã®åé¡ãããã§ããã«ã©ã®çšåºŠé¢é£ããŠãããã¯ããããŸããããå°ãªããšããäžéšã®äººã«åœ¹ç«ã€å¯èœæ§ããããããããã«æ å ±ãããããã§ããŸãã_
FirestoreããŒã¿ããŒã¹å ã®ããã¥ã¡ã³ãããããã§æŽæ°ããããšããfirebaseé¢æ°ã«ãåãããšããããŸããã ïŒããããªãã§ãã¹ãããŸããã§ããïŒã
ããã¯ã³ãŒã«ã¹ã¿ãã¯ã§ãïŒ
ã³ãã³ãã©ã€ã³ã䜿çšããŠããŒã«ã«ã§é¢æ°ãå®è¡ããŠããŸããã
firebase functions:shell
ç§ã¯ãã®ã³ãŒãã䜿çšããŠããŸããïŒ
è¡ãå€æŽããŸãã
admin.initializeApp();
ã«
admin.initializeApp({ credential: admin.credential.applicationDefault() });
ãããŠä»ãç§ã¯èªåã®é¢æ°ãããŒã«ã«ã§åŒã³åºãããšãã§ããŸããïŒ
admin.credential.applicationDefaultïŒïŒã«ã€ããŠã¯ããã¥ã¡ã³ããåç §ããŠãã ãã