为什么 运行 firebase 模拟器也执行我的功能之一?
Why does running firebase emulators also execute one of my functions?
I 运行 firebase emulators:start --only functions,firestore
并得到以下输出:
$ firebase emulators:start --only functions,firestore
i emulators: Starting emulators: functions, firestore
⚠ functions: The following emulators are not running, calls to these services from the Functions emulator will affect production: database, hosting, pubsub
✔ functions: Using node@10 from host.
⚠ functions: Your GOOGLE_APPLICATION_CREDENTIALS environment variable points to /Users/user/development/project/app/serviceKey.json. Non-emulated services will access production using these credentials. Be careful!
i firestore: Firestore Emulator logging to firestore-debug.log
i ui: Emulator UI logging to ui-debug.log
i functions: Watching "/Users/user/development/project/app/functions" for Cloud Functions...
> TEST TEST 123
✔ functions[test-func1]: http function initialized (http://localhost:5001/project-9999d/us-east1/test-func1).
✔ functions[test-func2]: http function initialized (http://localhost:5001/project-9999d/us-east1/test-func2).
✔ functions[test-func3]: firestore function initialized.
✔ functions[test1-func1]: http function initialized (http://localhost:5001/project-9999d/us-east1/test1-func1).
✔ functions[test1-func2]: http function initialized (http://localhost:5001/project-9999d/us-east1/test1-func2).
✔ functions[test3-func1]: http function initialized (http://localhost:5001/project-9999d/us-east1/test3-func1).
✔ functions[test3-func2]: http function initialized (http://localhost:5001/project-9999d/us-east1/test3-func2).
✔ functions[test4]: http function initialized (http://localhost:5001/project-9999d/us-east1/test4).
i functions[test5-func1]: function ignored because the pubsub emulator does not exist or is not running.
函数在functions/scraper/index.js
中定义为:
exports.scraper = url => {
console.log('TEST TEST', url)
return null
}
它是在 functions/cron/index.js
中导入和调用的
const functions = require('firebase-functions')
const test = require('../scraper')
const schedule = `every 6 hours`
exports.testFunction = functions.pubsub
.schedule(schedule)
.onRun(test.scraper('123'))
为什么我看到这个函数的输出 TEST TEST 123
而不是我的其他函数?如何避免在 运行ning 模拟器时执行此功能?
我正在尝试在本地测试计划的 cron 函数,但当模拟器 运行.
时它一直在执行
通过写入 .onRun(test.scraper('123'))
,您向 运行 pubsub
请求 test.scraper('123')
的 返回值 。这就是为什么在环境初始化期间调用该函数的原因。
如果你想运行 test.scraper('123')
每6小时,你必须把它包装成一个函数。
exports.testFunction = functions.pubsub
.schedule(schedule)
.onRun(() => test.scraper('123'))
更清楚:
exports.testFunction = functions.pubsub
.schedule(schedule)
.onRun(scheduledFunction)
function scheduledFunction() {
test.scraper('123')
}
I 运行 firebase emulators:start --only functions,firestore
并得到以下输出:
$ firebase emulators:start --only functions,firestore
i emulators: Starting emulators: functions, firestore
⚠ functions: The following emulators are not running, calls to these services from the Functions emulator will affect production: database, hosting, pubsub
✔ functions: Using node@10 from host.
⚠ functions: Your GOOGLE_APPLICATION_CREDENTIALS environment variable points to /Users/user/development/project/app/serviceKey.json. Non-emulated services will access production using these credentials. Be careful!
i firestore: Firestore Emulator logging to firestore-debug.log
i ui: Emulator UI logging to ui-debug.log
i functions: Watching "/Users/user/development/project/app/functions" for Cloud Functions...
> TEST TEST 123
✔ functions[test-func1]: http function initialized (http://localhost:5001/project-9999d/us-east1/test-func1).
✔ functions[test-func2]: http function initialized (http://localhost:5001/project-9999d/us-east1/test-func2).
✔ functions[test-func3]: firestore function initialized.
✔ functions[test1-func1]: http function initialized (http://localhost:5001/project-9999d/us-east1/test1-func1).
✔ functions[test1-func2]: http function initialized (http://localhost:5001/project-9999d/us-east1/test1-func2).
✔ functions[test3-func1]: http function initialized (http://localhost:5001/project-9999d/us-east1/test3-func1).
✔ functions[test3-func2]: http function initialized (http://localhost:5001/project-9999d/us-east1/test3-func2).
✔ functions[test4]: http function initialized (http://localhost:5001/project-9999d/us-east1/test4).
i functions[test5-func1]: function ignored because the pubsub emulator does not exist or is not running.
函数在functions/scraper/index.js
中定义为:
exports.scraper = url => {
console.log('TEST TEST', url)
return null
}
它是在 functions/cron/index.js
const functions = require('firebase-functions')
const test = require('../scraper')
const schedule = `every 6 hours`
exports.testFunction = functions.pubsub
.schedule(schedule)
.onRun(test.scraper('123'))
为什么我看到这个函数的输出 TEST TEST 123
而不是我的其他函数?如何避免在 运行ning 模拟器时执行此功能?
我正在尝试在本地测试计划的 cron 函数,但当模拟器 运行.
时它一直在执行通过写入 .onRun(test.scraper('123'))
,您向 运行 pubsub
请求 test.scraper('123')
的 返回值 。这就是为什么在环境初始化期间调用该函数的原因。
如果你想运行 test.scraper('123')
每6小时,你必须把它包装成一个函数。
exports.testFunction = functions.pubsub
.schedule(schedule)
.onRun(() => test.scraper('123'))
更清楚:
exports.testFunction = functions.pubsub
.schedule(schedule)
.onRun(scheduledFunction)
function scheduledFunction() {
test.scraper('123')
}