๋ฒ์ ์ ๋ณด: 6.1.0
ํ๋ซํผ ์ ๋ณด: OSX
CD ๋๋ ํ ๋ฆฌ
Firebase ์ด๊ธฐํ(ํธ์คํ
์ ์ฉ)
๊ธฐ์กด ํ๋ก์ ํธ ์ ํ
Firebase ์๋น์ค --๋ง ํธ์คํ
--debug
์ฌ์ดํธ๋ฅผ ๋ก์ปฌ์์ ์คํํฉ๋๋ค.
[2018-11-15T17:12:15.331Z] <<< HTTP ์๋ต 400 ๋ค์ํจ=X-Origin, Referer, Origin, Accept-Encoding, content-type=application/json; charset=UTF-8, ๋ ์ง=Thu, 15 Nov 2018 17:12:15 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", ํ์ฉ ๋ฒ์=์์, ์ฐ๊ฒฐ=๋ซ๊ธฐ
[2018-11-15T17:12:15.331Z] <<< HTTP RESPONSE BODY ์ฝ๋=400, ๋ฉ์์ง=์์ฒญ์ ์๋ชป๋ ์ธ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค., ์ํ=INVALID_ARGUMENT
์ค๋ฅ: HTTP ์ค๋ฅ: 400, ์์ฒญ์ ์๋ชป๋ ์ธ์๊ฐ ์์ต๋๋ค.
[2018-11-15T17:12:15.532Z] ์ค๋ฅ ์ปจํ
์คํธ: {
"๋ชธ": {
"์ค๋ฅ": {
"์ฝ๋": 400,
"message": "์์ฒญ์ ์๋ชป๋ ์ธ์๊ฐ ์์ต๋๋ค.",
"์ํ": "INVALID_ARGUMENT"
}
},
"์๋ต": {
"์ํ ์ฝ๋": 400,
"๋ชธ": {
"์ค๋ฅ": {
"์ฝ๋": 400,
"message": "์์ฒญ์ ์๋ชป๋ ์ธ์๊ฐ ์์ต๋๋ค.",
"์ํ": "INVALID_ARGUMENT"
}
},
"ํค๋": {
"vary": "X-Origin, Referer, Origin, Accept-Encoding",
"์ฝํ
์ธ ์ ํ": "์์ฉ ํ๋ก๊ทธ๋จ/json; charset=UTF-8",
"๋ ์ง": "2018๋
11์ 15์ผ ๋ชฉ์์ผ 17:12:15 GMT",
"์๋ฒ": "ESF",
"์บ์ ์ ์ด": "๋น๊ณต๊ฐ",
"x-xss-๋ณดํธ": "1; ๋ชจ๋=์ฐจ๋จ",
"x-frame-options": "SAMEORIGIN",
"x-content-type-options": "nosniff",
"alt-svc": "quic=\":443\"; ma=2592000; v=\"44,43,39,35\"",
"์๋ฝ ๋ฒ์": "์์",
"์ฐ๊ฒฐ": "๋ซ๊ธฐ"
},
"์๊ตฌ": {
"์ฐ๋ฆฌ": {
"ํ๋กํ ์ฝ": "https:",
"์ฌ๋์": ์ฌ์ค,
"์ธ์ฆ": null,
"ํธ์คํธ": "mobilesdk-pa.googleapis.com",
"ํฌํธ": 443,
"ํธ์คํธ ์ด๋ฆ": "mobilesdk-pa.googleapis.com",
"ํด์": null,
"๊ฒ์": null,
"์ฟผ๋ฆฌ": null,
"๊ฒฝ๋ก ์ด๋ฆ": "/v1/projects/540833485883/clients/_:getWebAppConfig",
"๊ฒฝ๋ก": "/v1/projects/540833485883/clients/_:getWebAppConfig",
"href": " https://mobilesdk-pa.googleapis.com/v1/projects/540833485883/clients/_ :getWebAppConfig"
},
"๋ฉ์๋": "GET"
}
}
}
๋์ผ:
๋ฒ์ ์ ๋ณด: 6.1.0(6.0.0, 5.0.0์์๋ ํ
์คํธ๋จ)
ํ๋ซํผ ์ ๋ณด: OSX 10.14 macOS Mojave 18A391
$ firebase serve --only hosting,functions --debug
๊ธฐ์กด ํ๋ก์ ํธ์ ์ ํ๋ก์ ํธ๋ก ํ ์คํธํ์ต๋๋ค. ๊ฐ์ ์ค๋ฅ์ ๋๋ค.
Error: HTTP Error: 400, Request contains an invalid argument.
[2018-11-15T17:40:46.943Z] Error Context: {
"body": {
"error": {
"code": 400,
"message": "Request contains an invalid argument.",
"status": "INVALID_ARGUMENT"
}
},
"response": {
"statusCode": 400,
"body": {
"error": {
"code": 400,
"message": "Request contains an invalid argument.",
"status": "INVALID_ARGUMENT"
}
},
"headers": {
"vary": "X-Origin, Referer, Origin,Accept-Encoding",
"content-type": "application/json; charset=UTF-8",
"date": "Thu, 15 Nov 2018 17:40:46 GMT",
"server": "ESF",
"cache-control": "private",
"x-xss-protection": "1; mode=block",
"x-frame-options": "SAMEORIGIN",
"x-content-type-options": "nosniff",
"alt-svc": "quic=\":443\"; ma=2592000; v=\"44,43,39,35\"",
"accept-ranges": "none",
"connection": "close"
},
"request": {
"uri": {
"protocol": "https:",
"slashes": true,
"auth": null,
"host": "mobilesdk-pa.googleapis.com",
"port": 443,
"hostname": "mobilesdk-pa.googleapis.com",
"hash": null,
"search": null,
"query": null,
"pathname": "/v1/projects/128559963708/clients/_:getWebAppConfig",
"path": "/v1/projects/128559963708/clients/_:getWebAppConfig",
"href": "https://mobilesdk-pa.googleapis.com/v1/projects/128559963708/clients/_:getWebAppConfig"
},
"method": "GET"
}
}
}
์ ํํ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฐฉ๊ธ ๋ค๋ฅธ ์ปดํจํฐ์์ ๋ณ๊ฒฝ ์์ด ๋์ผํ ํ๋ก์ ํธ๋ฅผ ํ
์คํธํ์ผ๋ฉฐ ์ฝ 3๊ฐ์ ๋์ ์ ์คํ๋๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ๋ฌธ์ ๊ฐ ๋์ผํฉ๋๋ค. ์ ์์ ์ผ๋ก ๋ฐฐํฌ๋์ง๋ง localhost(_firebase serve --only functions,hosting --debug_)๋ ์ด ์ค๋ฅ์ ํจ๊ป ์๋์ ๋ฉ์ถฅ๋๋ค...
๋ฌธ์ ๊ฐ ์ฑ(๋ด ๊ฒ ๋๋ ๊ทํ์ ๊ฒ)์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ฝ 2์๊ฐ ์ ์๋ ๋ชจ๋ ๊ฒ์ด ์ ์๋ํ์ต๋๋ค!
๋๋ฅผ ์ํด +1
๊ฐ์ ๋ฌธ์ . ์ด์ ๋ชจ๋ ๊ฒ์ด ์ ์๋ํ์ต๋๋ค
[2018-11-15T17:22:20.885Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/xxx/clients/_:getWebAppConfig
[2018-11-15T17:22:21.179Z] <<< HTTP RESPONSE BODY code=400, message=Request contains an invalid argument., status=INVALID_ARGUMENT
์ ์ ์น๊ตฌ๋ฅผ ์ํด +1 ์ด์ ์ ์์ ์ผ๋ก ์๋ํ๋๋ฐ ์ค๋ ์์นจ์ ์๋์ ๋ฉ์ท์ต๋๋ค. https://status.firebase.google.com ์์ ์ด์ ๋ํด ์๋ฌด ๊ฒ๋ ๋ณผ ์ ์์ต๋๋ค. Firebase์์ ๋๊ธ์ ๋ฌ ์ ์๋ ์ฌ๋์ด ์์ต๋๊น?
๋๋ฅผ ์ํด +1 - ๋ชจ๋ ๊ฒ์ด ๊ฐ์๊ธฐ ์๋์ ๋ฉ์ท์ต๋๋ค. 6.0.1์์ 6.1.0์ผ๋ก ์
๊ทธ๋ ์ด๋๋ฅผ ์๋ํ๋๋ฐ ์ด์ firebase serve
์์๋ ๋ค์ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
functions: Preparing to emulate functions.
โ Setup required, please run: firebase setup:emulators:firestore
ํด๋น ๋ช
๋ น์ ์ฑ๊ณต์ ์ผ๋ก ์คํํ๊ณ firebase serve
๋ค์ ์คํํ๋ ค๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
i functions: Preparing to emulate functions.
โ firestore: started on http://localhost:8080
โ firestore: Error: Invalid or corrupt jarfile /home/alex/.cache/firebase/emulators/cloud-firestore-emulator-v1.2.1.jar
๋ฐฉ๊ธ ์คํํ ๋ช ๋ น์ ์ฐพ์๋ณด๋ ๋ค์ ํ์ด์ง๊ฐ ์์ต๋๋ค. https://firebase.google.com/docs/firestore/security/test-rules-emulator
6.1.0์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๊ณ firebase --open-sesame emulators
์คํํ๋ ค๊ณ ์๋ํ๋๋ฐ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
Error: Did not recognize preview feature
+1 ๊ฐ์ ๋ฌธ์ , ์ค๋ ์์นจ์ ์์๋จ
+1. firebase-tools
๋ฒ์ v6.0.1 ๋ฐ v6.1.0๊ณผ ํจ๊ป ๊ธฐ์กด ํ๋ก์ ํธ์์ ๋งค๊ฐ๋ณ์ ์์ด firebase serve
๋ฅผ ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๋ํ firebase serve
๋ช
๋ น์ ์๋น์ค ํฌํธ๋ฅผ ์ฌ๋ ๋
ธ๋ ํ๋ก์ธ์ค๋ฅผ ์ ๋๋ก ๋ซ์ง ์๊ณ ์ข
๋ฃ๋๋ฏ๋ก ํด๋น ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ์ข
๋ฃํด์ผ ํฉ๋๋ค.
์ ์๊ฒ๋ ์ด ๋ฌธ์ ๊ฐ ์์์ ์ถ๊ฐํ๊ณ ์ถ์์ต๋๋ค. Firebase ์๋ธ๋ ์ด์ ์ ์๋ํ์ต๋๋ค. ์ด๊ฒ์ Firebase 6.0.1๊ณผ 6.1.0 ๋ชจ๋์ ์์ต๋๋ค.
๋๋ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ์!
๊ฐ์. ์ง๊ธ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
์ ๋ ์:
์ด ์ฌ์ค์ ์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์กฐ์ฌํ๊ณ ์์ต๋๋ค.
(๋ด๋ถ ์ถ์ ๋ฒํธ: 119615185)
@Neilpoulin ๋ฐฐํฌํ ์ ์์ต๋๊น? ์ด๋ค ๋ฒ์ ์ CLI๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๊น?
์ฃ์กํฉ๋๋ค. fire base deploy ๋ช
๋ น๊ณผ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ด ๋น๋
ํ๋ก์ธ์ค์๋ ์ด๋ฌํ ๊ตฌ์ฑ์ ๊ฐ์ ธ์ค๋ ๋จ๊ณ๊ฐ ํฌํจ๋๋ฉฐ ์คํจํ๋ฏ๋ก
๋ฐฐํฌํ ์ ์์ต๋๋ค.
2018๋
11์ 15์ผ ๋ชฉ์์ผ ์คํ 12:10 Michael Bleigh [email protected]
์ผ๋ค:
@Neilpoulin https://github.com/Neilpoulin ๋ฐฐํฌํ ์ ์์ต๋๊น? ๋ญ
์ฌ์ฉ ์ค์ธ CLI ๋ฒ์ ์ ๋ฌด์์ด๋ฉฐ ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๊น?โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/firebase/firebase-tools/issues/1015#issuecomment-439155616 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAw-atNnP6wSmeHQke6z4EKIsx1D6r7Yks5uvbw_gaJpZM4Ygu-y
.
์ด๊ฒ์ด ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด๋๋ค๋ฉด ๊ทธ ๋์ ํฌํธ๋ฅผ ๊ฐ์ ๋ก ์คํํ์ฌ ๊ธฐ๋ฅ์ ์คํํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฐฐํฌ ๋๋ ํธ์คํ
์ ๋์์ด ๋์ง ์์ต๋๋ค. ์์:
sudo firebase serve --only ๊ธฐ๋ฅ --port=9000
๊ฐ์ ๋ฌธ์ ... ์ด ๋ฌธ์ ๋ก ์ธํด ๊ฐ๋ฐ์ด ์ค๋จ๋์์ต๋๋ค. ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ Firebase ๊ธฐ๋ฅ์ผ๋ก ํธ์คํ ๋๋ ๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ต๋๋ค. ์ด๊ฒ์ Firebase ์๋น์ค์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ํ ๋์๋ณด๋๋ ๋ชจ๋ ๋ น์์ผ๋ก ํ์๋ฉ๋๋ค. ์ด์ ๊น์ง๋ ๋ชจ๋ ์ ์๋ํ์ต๋๋ค.
์ง๊ธ ์๋ํ์ง๋ง ๊ฒฝ๊ณ ์ ํจ๊ป ...
โ database: WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/Users/rodrigodutra/.cache/firebase/emulators/firebase-database-emulator-v3.5.0.jar) to field sun.nio.ch.SelectorImpl.selectedKeys
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
โ database:
...
๋ ์ด์ ์๋ชป๋ ์ธ์ 400 ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง ํ์ฌ ๊ทธ ์๋ฆฌ์ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ์์ง๋ง ์ฌ์ ํ ์คํ๋์ง ์์ต๋๋ค.
2018-11-15T20:01:14.098Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Thu, 15 Nov 2018 20:01:22 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close
[2018-11-15T20:01:14.098Z] Starting @google-cloud/functions-emulator
[2018-11-15T20:01:14.115Z] Parsing function triggers
Warning: You're using Node.js v10.13.0 but Google Cloud Functions only supports v6.11.5.
[2018-11-15T20:01:14.238Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Thu, 15 Nov 2018 20:01:22 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close
i hosting: Serving hosting files from: public
โ hosting: Local server: http://localhost:5000
โ database: WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/home/qkay/.cache/firebase/emulators/firebase-database-emulator-v3.5.0.jar) to field sun.nio.ch.SelectorImpl.selectedKeys
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
โ database:
error: SUPERVISOR error Error: listen EADDRINUSE 127.0.0.1:5001
at Server.setupListenHandle [as _listen2] (net.js:1286:14)
at listenInCluster (net.js:1334:12)
at GetAddrInfoReqWrap.doListen [as callback] (net.js:1460:7)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:62:10)
error: supervisorPort (5001) is already in use
error: restPort (5002) is already in use
12:01:15.254 [NamespaceSystem-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
12:01:15.408 [main] INFO com.firebase.server.forge.App$ - Listening on port 9000
12:01:15.438 [main] ERROR com.firebase.server.forge.App$ - Error initializing Netty Listener
java.net.BindException: Address already in use
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:461)
at java.base/sun.nio.ch.Net.bind(Net.java:453)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:128)
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:500)
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1226)
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:495)
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:480)
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:209)
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:355)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:464)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
at java.base/java.lang.Thread.run(Thread.java:834)
12:01:15.440 [Thread-1] INFO com.firebase.server.forge.App$ - Attempting graceful shutdown.
12:01:15.444 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.actor.CoordinatedShutdown - Starting coordinated shutdown from JVM shutdown hook
12:01:15.448 [Thread-1] INFO com.firebase.server.forge.App$ - Graceful shutdown complete.
Error: database: emulator has exited with code: 1
๋ ์ด์ ์๋ชป๋ ์ธ์ 400 ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง ํ์ฌ ๊ทธ ์๋ฆฌ์ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ์์ง๋ง ์ฌ์ ํ ์คํ๋์ง ์์ต๋๋ค.
2018-11-15T20:01:14.098Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Thu, 15 Nov 2018 20:01:22 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close [2018-11-15T20:01:14.098Z] Starting @google-cloud/functions-emulator [2018-11-15T20:01:14.115Z] Parsing function triggers Warning: You're using Node.js v10.13.0 but Google Cloud Functions only supports v6.11.5. [2018-11-15T20:01:14.238Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Thu, 15 Nov 2018 20:01:22 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close i hosting: Serving hosting files from: public โ hosting: Local server: http://localhost:5000 โ database: WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/home/qkay/.cache/firebase/emulators/firebase-database-emulator-v3.5.0.jar) to field sun.nio.ch.SelectorImpl.selectedKeys WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release โ database: error: SUPERVISOR error Error: listen EADDRINUSE 127.0.0.1:5001 at Server.setupListenHandle [as _listen2] (net.js:1286:14) at listenInCluster (net.js:1334:12) at GetAddrInfoReqWrap.doListen [as callback] (net.js:1460:7) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:62:10) error: supervisorPort (5001) is already in use error: restPort (5002) is already in use 12:01:15.254 [NamespaceSystem-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started 12:01:15.408 [main] INFO com.firebase.server.forge.App$ - Listening on port 9000 12:01:15.438 [main] ERROR com.firebase.server.forge.App$ - Error initializing Netty Listener java.net.BindException: Address already in use at java.base/sun.nio.ch.Net.bind0(Native Method) at java.base/sun.nio.ch.Net.bind(Net.java:461) at java.base/sun.nio.ch.Net.bind(Net.java:453) at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227) at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:128) at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:500) at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1226) at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:495) at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:480) at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973) at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:209) at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:355) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:464) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138) at java.base/java.lang.Thread.run(Thread.java:834) 12:01:15.440 [Thread-1] INFO com.firebase.server.forge.App$ - Attempting graceful shutdown. 12:01:15.444 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.actor.CoordinatedShutdown - Starting coordinated shutdown from JVM shutdown hook 12:01:15.448 [Thread-1] INFO com.firebase.server.forge.App$ - Graceful shutdown complete. Error: database: emulator has exited with code: 1
Mac์ ์ฌ๋ถํ ํ์ญ์์ค...
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด firebase serve --only hosting
๋๋ firebase serve --only functions
๋ฅผ ์๋ํ์ญ์์ค. ์ง๊ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค.
๋์๊ฒ๋ ๋ฌธ์ ๊ฐ ์์๋ค. ๋ฐฉ๊ธ ๋ด ์ปดํจํฐ๋ฅผ ์ฌ๋ถํ ํ๋๋ฐ ๋ค์ ์๋ํฉ๋๋ค.
@Neilpoulin ๋ฐฐํฌํ ์ ์์ต๋๊น? ์ด๋ค ๋ฒ์ ์ CLI๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๊น?
@mbleigh ๋ด ์ปดํจํฐ๋ก ๋์์์ ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์ถ์์ต๋๋ค.
ํนํ ๋
ธ๋์์ firebase-tools
ํ๊ณ ์์ต๋๋ค. ์คํจํ ๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์ค๋ฅ๊ฐ ์ฒ์ ๋ฐ์ํ์ ๋ firbase-tools
๋ 6.0.1
๋ฒ์ ์ด์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ 6.1.0
๋ก ์
๊ทธ๋ ์ด๋ํ์ง๋ง ์ค๋ฅ๋ ๋์ผํ์ต๋๋ค.
const fbcli = require("firebase-tools");
const opts = {"project": "stage"}; //this is an active alias for my firebase setup
return fbcli.setup
.web(opts)
.then(firebaseConfig => {
// some config setup stuff for webpack
}.catch(error => {
//This gets called rigt away, see error object below
console.error(error);
})
์ก์ ์ค๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"name": "FirebaseError",
"message": "HTTP Error: 400, Request contains an invalid argument.",
"children": [],
"status": 500,
"exit": 1,
"stack": "Error\n at new FirebaseError (/Users/myrepo/node_modules/firebase-tools/src/error.js:11:16)\n at module.exports (/Users/myrepo/node_modules/firebase-tools/src/responseToError.js:46:10)\n at Request._callback (/Users/myrepo/node_modules/firebase-tools/src/api.js:50:25)\n at Request.self.callback (/Users/myrepo/node_modules/request/request.js:185:22)\n at emitTwo (events.js:126:13)\n at Request.emit (events.js:214:7)\n at Request.<anonymous> (/Users/myrepo/node_modules/request/request.js:1161:10)\n at emitOne (events.js:116:13)\n at Request.emit (events.js:211:7)\n at IncomingMessage.<anonymous> (/Users/myrepo/node_modules/request/request.js:1083:12)",
"context": {
"body": {
"error": {
"code": 400,
"message": "Request contains an invalid argument.",
"status": "INVALID_ARGUMENT"
}
},
"response": {
"statusCode": 400,
"body": {
"error": {
"code": 400,
"message": "Request contains an invalid argument.",
"status": "INVALID_ARGUMENT"
}
},
"headers": {
"vary": "X-Origin, Referer, Origin,Accept-Encoding",
"content-type": "application/json; charset=UTF-8",
"date": "Thu, 15 Nov 2018 18:33:41 GMT",
"server": "ESF",
"cache-control": "private",
"x-xss-protection": "1; mode=block",
"x-frame-options": "SAMEORIGIN",
"x-content-type-options": "nosniff",
"alt-svc": "quic=\":443\"; ma=2592000; v=\"44,43,39,35\"",
"accept-ranges": "none",
"connection": "close"
},
"request": {
"uri": {
"protocol": "https:",
"slashes": true,
"auth": null,
"host": "mobilesdk-pa.googleapis.com",
"port": 443,
"hostname": "mobilesdk-pa.googleapis.com",
"hash": null,
"search": null,
"query": null,
"pathname": "/v1/projects/465836249868/clients/_:getWebAppConfig",
"path": "/v1/projects/465836249868/clients/_:getWebAppConfig",
"href": "https://mobilesdk-pa.googleapis.com/v1/projects/465836249868/clients/_:getWebAppConfig"
},
"method": "GET"
}
}
}
}
1:16pm MT ํ์ฌ ํธ์ง, ๋ ์ด์ ์ด ์ค๋ฅ๊ฐ ํ์๋์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํจ ๋ฐฑ์๋ ๋น๋๋ฅผ ๋กค๋ฐฑํ์ต๋๋ค. ์ง๊ธ ์ด๊ฒ์ ์๋ํ๊ณ ์ฌ์ ํ ๊ณ ์ฅ ๋ฌ๋์ง ํ์ธํ ์ ์์ต๋๊น?
๋๋ฅผ ์ํด ์ผํ๋ค
+1 ์ง๊ธ ์๋ ์ค์ ๋๋ค. ๊ฐ์ฌ
+1๋ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ ํ์ธํ์ต๋๋ค.
๋น์ฆ๋์ค์์ +1
@ryanpbrewster ๋ค, ๋ค์ ์๋ํฉ๋๋ค. ๊ฐ์ฌ ํด์! ๋ํฌ๋ค์ ๊ทธ๊ฒ์ ์ํด ์ผ์ข ์ e2 ํ ์คํ ์ ํด์ผ ํ๋ค.
ps: ์ฌ๋ถํ
์์ด ์๋ํ์ง๋ง firebase serve
์ ์ ์ผ๋ถ ์ค๋จ๋ ๋
ธ๋ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ข
๋ฃ
์ฌ๋ถํ ํ์๋ ์ฌ์ ํ ์ด์ ๋ฐฐํฌ ์๋์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์์์ต๋๋ค. ๋ฐฉ๊ธ ๋งจ ์๋ก ์ด๋ํ์ฌ ์๋์ผ๋ก ์ข ๋ฃํ์ผ๋ฉฐ ์ด์ Firebase ๋๊ตฌ๊ฐ ์ ๋๋ก ์๋ํฉ๋๋ค.
+1 ๋ชจ๋ ์ค์ ! ๋ง์ด ์ฐ์ธ์.
๊ธฐ๋ค๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์๋ชป๋ ์ธ์ ์ค๋ฅ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
'firebase ๋ฐฐํฌ'์์ ์ง๊ธ 5์๊ฐ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค.
๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
exports.makeUppercase = functions.database.ref('/userfollowers/{pushId}/followers')
.onWrite((change, context) => {
// Only edit data when it is first created.
if (change.before.exists()) {
return null;
}
// Exit when the data is deleted.
if (!change.after.exists()) {
return null;
}
// Grab the current value of what was written to the Realtime Database.
const original = change.after.val();
console.log('Uppercasing', context.params.pushId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing asynchronous tasks inside a Functions such as
// writing to the Firebase Realtime Database.
// Setting an "uppercase" sibling in the Realtime Database returns a Promise.
return change.after.ref.parent.child('uppercase').set(uppercase);
});
๋ฌธ์์์ ๋ฐ๋ก ๋์จ ๊ฒ์ ๋๋ค.
ํฐ๋ฏธ๋์ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
โ functions: failed to create function makeUppercase
HTTP Error: 400, The request has errors
ํด๋ผ์ฐ๋ ๊ธฐ๋ฅ ๋ก๊ทธ๋ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"INVALID_ARGUMENT"},"authenticationInfo":{"principalEmail":"[email protected]"},"requestMetadata":{"callerIp":"86.120.235.246","callerSuppliedUserAgent":"FirebaseCLI/3.19.0,gzip(gfe),gzip(gfe)","requestAttributes":{"time":"2019-05-14T08:34:18.563Z","auth":{}},"destinationAttributes":{}},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1.CloudFunctionsService.CreateFunction","authorizationInfo":[{"resource":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}},{"permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}}],"resourceName":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","request":{"location":"projects/parkour-9136c/locations/us-central1","@type":"type.googleapis.com/google.cloud.functions.v1.CreateFunctionRequest","function":{"labels":{"deployment-tool":"cli-firebase"},"entryPoint":"makeUppercase","eventTrigger":{"eventType":"providers/google.firebase.database/eventTypes/ref.write","resource":"projects/_/instances/parkour-9136c/refs/userfollowers/{pushId}/followers","service":"firebaseio.com"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-f5adb7fe-7321-4f3c-8fe0-2b2307d26138/5b099ea8-161b-44a7-a3bd-18ce75c64859.zip?GoogleAccessId=service-807137615499@gcf-admin-robot.iam.gserviceaccount.com&Expires=1557824657&Signature=PJKzJsZtHWO1kIkmrSojpdgvb0jRzV91eNC9rZc4j%2FMcoHjILGm36FKCt6qQ2fxeAUu1%2FbrxpagdI7fHmUUUrDdTmnTNISr7FiN61sifUI%2B%2FGnUwo8SguzvrA7kADFqu8nD05FAo7BvG7biUrHmLgISlwo5dTKqcTSmExnaICA1tHYxjz%2Fk0RbmdGkcQ5HdeCKBnW0R7wQPsxswQyvR4cAU4WD2m3PPM9lncVr7pB%2Fh77FboGLi3sq%2FGHyEwUtjfUmyN9d%2FYUpKs48TMsGPknAGIvaFFUWQR23YCDUcrPipq1nW2W1JUdf5nGylYmVEeyF3jLrm%2BsOIcXiZ6LCRhpg%3D%3D","name":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase"}}}
ํด๊ฒฐ์ฑ
์ด ๋ฌด์ ์ด๋?
๊ฐ์ฌ
@nicoara ๋ ํ์ ์ ๋ณด๋ก ์ ๋ฌธ์ ๋ฅผ ์ด์ด์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค.
'firebase ๋ฐฐํฌ'์์ ์ง๊ธ 5์๊ฐ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค.
๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
exports.makeUppercase = functions.database.ref('/userfollowers/{pushId}/followers') .onWrite((change, context) => { // Only edit data when it is first created. if (change.before.exists()) { return null; } // Exit when the data is deleted. if (!change.after.exists()) { return null; } // Grab the current value of what was written to the Realtime Database. const original = change.after.val(); console.log('Uppercasing', context.params.pushId, original); const uppercase = original.toUpperCase(); // You must return a Promise when performing asynchronous tasks inside a Functions such as // writing to the Firebase Realtime Database. // Setting an "uppercase" sibling in the Realtime Database returns a Promise. return change.after.ref.parent.child('uppercase').set(uppercase); });
๋ฌธ์์์ ๋ฐ๋ก ๋์จ ๊ฒ์ ๋๋ค.
ํฐ๋ฏธ๋์ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
โ functions: failed to create function makeUppercase HTTP Error: 400, The request has errors
ํด๋ผ์ฐ๋ ๊ธฐ๋ฅ ๋ก๊ทธ๋ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"INVALID_ARGUMENT"},"authenticationInfo":{"principalEmail":"[email protected]"},"requestMetadata":{"callerIp":"86.120.235.246","callerSuppliedUserAgent":"FirebaseCLI/3.19.0,gzip(gfe),gzip(gfe)","requestAttributes":{"time":"2019-05-14T08:34:18.563Z","auth":{}},"destinationAttributes":{}},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1.CloudFunctionsService.CreateFunction","authorizationInfo":[{"resource":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}},{"permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}}],"resourceName":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","request":{"location":"projects/parkour-9136c/locations/us-central1","@type":"type.googleapis.com/google.cloud.functions.v1.CreateFunctionRequest","function":{"labels":{"deployment-tool":"cli-firebase"},"entryPoint":"makeUppercase","eventTrigger":{"eventType":"providers/google.firebase.database/eventTypes/ref.write","resource":"projects/_/instances/parkour-9136c/refs/userfollowers/{pushId}/followers","service":"firebaseio.com"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-f5adb7fe-7321-4f3c-8fe0-2b2307d26138/5b099ea8-161b-44a7-a3bd-18ce75c64859.zip?GoogleAccessId=service-807137615499@gcf-admin-robot.iam.gserviceaccount.com&Expires=1557824657&Signature=PJKzJsZtHWO1kIkmrSojpdgvb0jRzV91eNC9rZc4j%2FMcoHjILGm36FKCt6qQ2fxeAUu1%2FbrxpagdI7fHmUUUrDdTmnTNISr7FiN61sifUI%2B%2FGnUwo8SguzvrA7kADFqu8nD05FAo7BvG7biUrHmLgISlwo5dTKqcTSmExnaICA1tHYxjz%2Fk0RbmdGkcQ5HdeCKBnW0R7wQPsxswQyvR4cAU4WD2m3PPM9lncVr7pB%2Fh77FboGLi3sq%2FGHyEwUtjfUmyN9d%2FYUpKs48TMsGPknAGIvaFFUWQR23YCDUcrPipq1nW2W1JUdf5nGylYmVEeyF3jLrm%2BsOIcXiZ6LCRhpg%3D%3D","name":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase"}}}
ํด๊ฒฐ์ฑ ์ด ๋ฌด์ ์ด๋?
๊ฐ์ฌ
'firebase ๋ฐฐํฌ'์์ ์ง๊ธ 5์๊ฐ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค.
๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
exports.makeUppercase = functions.database.ref('/userfollowers/{pushId}/followers') .onWrite((change, context) => { // Only edit data when it is first created. if (change.before.exists()) { return null; } // Exit when the data is deleted. if (!change.after.exists()) { return null; } // Grab the current value of what was written to the Realtime Database. const original = change.after.val(); console.log('Uppercasing', context.params.pushId, original); const uppercase = original.toUpperCase(); // You must return a Promise when performing asynchronous tasks inside a Functions such as // writing to the Firebase Realtime Database. // Setting an "uppercase" sibling in the Realtime Database returns a Promise. return change.after.ref.parent.child('uppercase').set(uppercase); });
๋ฌธ์์์ ๋ฐ๋ก ๋์จ ๊ฒ์ ๋๋ค.
ํฐ๋ฏธ๋์ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
โ functions: failed to create function makeUppercase HTTP Error: 400, The request has errors
ํด๋ผ์ฐ๋ ๊ธฐ๋ฅ ๋ก๊ทธ๋ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"INVALID_ARGUMENT"},"authenticationInfo":{"principalEmail":"[email protected]"},"requestMetadata":{"callerIp":"86.120.235.246","callerSuppliedUserAgent":"FirebaseCLI/3.19.0,gzip(gfe),gzip(gfe)","requestAttributes":{"time":"2019-05-14T08:34:18.563Z","auth":{}},"destinationAttributes":{}},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1.CloudFunctionsService.CreateFunction","authorizationInfo":[{"resource":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}},{"permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}}],"resourceName":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","request":{"location":"projects/parkour-9136c/locations/us-central1","@type":"type.googleapis.com/google.cloud.functions.v1.CreateFunctionRequest","function":{"labels":{"deployment-tool":"cli-firebase"},"entryPoint":"makeUppercase","eventTrigger":{"eventType":"providers/google.firebase.database/eventTypes/ref.write","resource":"projects/_/instances/parkour-9136c/refs/userfollowers/{pushId}/followers","service":"firebaseio.com"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-f5adb7fe-7321-4f3c-8fe0-2b2307d26138/5b099ea8-161b-44a7-a3bd-18ce75c64859.zip?GoogleAccessId=service-807137615499@gcf-admin-robot.iam.gserviceaccount.com&Expires=1557824657&Signature=PJKzJsZtHWO1kIkmrSojpdgvb0jRzV91eNC9rZc4j%2FMcoHjILGm36FKCt6qQ2fxeAUu1%2FbrxpagdI7fHmUUUrDdTmnTNISr7FiN61sifUI%2B%2FGnUwo8SguzvrA7kADFqu8nD05FAo7BvG7biUrHmLgISlwo5dTKqcTSmExnaICA1tHYxjz%2Fk0RbmdGkcQ5HdeCKBnW0R7wQPsxswQyvR4cAU4WD2m3PPM9lncVr7pB%2Fh77FboGLi3sq%2FGHyEwUtjfUmyN9d%2FYUpKs48TMsGPknAGIvaFFUWQR23YCDUcrPipq1nW2W1JUdf5nGylYmVEeyF3jLrm%2BsOIcXiZ6LCRhpg%3D%3D","name":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase"}}}
ํด๊ฒฐ์ฑ ์ด ๋ฌด์ ์ด๋?
๊ฐ์ฌ
db ์ฐธ์กฐ ๊ฒฝ๋ก ๋์ ๋ฌธ์๋ฅผ ์ถ๊ฐํด ๋ณด์ญ์์ค. ์: /userfollowers/{pushId}/followers/{follower}
@bkendall ์ ์ค๋ ๋๋ฅผ ์์ํ์ต๋๋ค: https://github.com/firebase/firebase-tools/issues/1317
'firebase deploy --debug'๋ฅผ ์คํํ๊ณ ์ ๋ฉ์์ง๋ฅผ ์ฐพ์์ต๋๋ค.
[2019-05-20T14:43:23.863Z] <<< HTTP RESPONSE 400 vary=X-Origin, Referer, Origin,Accept-Encoding, content-type=application/json; charset=UTF-8, date=Mon, 20 May 2019 14:43:23 GMT, server=ESF, cache-control=private, x-xss-protection=0, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="46,44,43,39", accept-ranges=none, connection=close
[2019-05-20T14:43:23.863Z] <<< HTTP RESPONSE BODY code=400, message=The request has errors, status=INVALID_ARGUMENT, details=[@type=type.googleapis.com/google.rpc.BadRequest, fieldViolations=[field=runtime, description=Runtime field cannot be empty.]]
โ functions: failed to create function makeUppercase
HTTP Error: 400, The request has errors
@soclbz ๋ณ๊ฒฝ์ ์ฐจ์ด๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค
๋์ผํ _"๋ฐํ์ ํ๋๋ ๋น์ ๋ ์ ์์ต๋๋ค."_ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
[2019-06-06T18:51:31.127Z] <<< HTTP ์๋ต 400 ๋ค์ํจ=X-Origin, Referer, Origin, Accept-Encoding, content-type=application/json; charset=UTF-8, ๋ ์ง=Thu, 06 June 2019 18:51:30 GMT, server=ESF, cache-control=private, x-xss-protection=0, x-frame-options=SAMEORIGIN, x-content- ์ ํ-
์ต์ =nosniff, alt-svc=quic=":443"; ma=2592000; v="46,44,43,39", ํ์ฉ ๋ฒ์=์์, ์ฐ๊ฒฐ=๋ซ๊ธฐ
[2019-06-06T18:51:31.128Z] <<< HTTP RESPONSE BODY code=400, message=์์ฒญ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค. status=INVALID_ARGUMENT, details=[@type=type.googleapis.com/google.rpc.BadRequest , fieldViolations=[field=runtime, description=๋ฐํ์ ํ๋๋ ๋น์๋ ์ ์์ต๋๋ค.]]
์ด๋ hello world ์์ ํจ์๋ฅผ ๋ฐฐํฌํ๋ ค๊ณ ํ ๋ npx firebase init
์ฌ์ฉํ์ฌ ์๋ก ์์ฑ๋ ํ๋ก์ ํธ์์๋ ๋ฐ์ํฉ๋๋ค.
@stpch ๋ ์ด์ ๋ฒ์ ์ CLI๋ฅผ ์ฌ์ฉ ์ค์ ๋๊น? #1317์ ๋ด์ฃผ์ธ์
@stpch ๋ ์ด์ ๋ฒ์ ์ CLI๋ฅผ ์ฌ์ฉ ์ค์ ๋๊น? #1317์ ๋ด์ฃผ์ธ์
์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ ๋์, npx
๋ณด๋ค ์ฐ์ ํ๋ yarn
๋ฅผ ํตํด ์ค์น๋ ์ด์ firebase-tools
๋ฒ์ ์ด ์์์ต๋๋ค. ํ์ฌ ์ต์ ๋ฒ์ ์ผ๋ก ์๋ ์ค์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ์ฌ์ค์ ์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์กฐ์ฌํ๊ณ ์์ต๋๋ค.
(๋ด๋ถ ์ถ์ ๋ฒํธ: 119615185)