我们正在将timerTrigger类型的函数部署到Azure函数应用程序。这是使用节点运行时以 typescript 形式编写的。函数本身一直在工作,直到我们添加了一个依赖项,sentry sdk(用于cron监视器检查),这听起来就像安装模块一样简单,确保它作为一个依赖项添加到package.json文件中,将模块导入到函数文件中,然后完成。在本地它工作得很好,一旦发布,它就不停地抱怨找不到某些模块。
现在奇怪的是,它一直在抱怨“其他”模块,如“debug”和“https-proxy-agent”。我还没有验证它,但也许他们是我们添加的模块的依赖关系?
我是不是漏掉了什么?是否安装了所有依赖项?
我们将在代码中导入包,如下所示。
import * as Sentry from '@sentry/node'
字符串
我们使用命令行工具发布该函数。
func azure functionapp publish
型
我确实找到了一个similar question on SO,但是解决方案不是很清楚,而且我们也没有使用vscode来部署/发布。
完整功能码:
import { AzureFunction, Context } from '@azure/functions'
import { Timer } from '@azure/functions/types/timer'
import * as Sentry from '@sentry/node'
const partnerImport: AzureFunction = async function (
context: Context,
timer: Timer
): Promise<void> {
const IS_SENTRY_CRON_MONITORING_ENABLED = process.env.IS_SENTRY_CRON_MONITORING_ENABLED
const API_SERVER_AUTH_TOKEN = process.env.API_SERVER_AUTH_TOKEN
const API_SERVER_URL = process.env.API_SERVER_URL
const NODE_ENV = process.env.NODE_ENV
let sentryCheckInId;
const timeStamp = new Date().toISOString()
if (timer.isPastDue) {
context.log.verbose('Timer is running a bit later', timeStamp)
}
Sentry.init({
dsn: "https://...sentry.io...",
environment: NODE_ENV,
});
context.log.verbose('Starting partner-import', timeStamp)
if (!API_SERVER_AUTH_TOKEN) {
throw new Error(`API_SERVER_AUTH_TOKEN not set ${timeStamp}`)
}
if (!API_SERVER_URL) {
throw new Error(`API_SERVER_URL not set ${timeStamp}`)
}
if (IS_SENTRY_CRON_MONITORING_ENABLED) {
sentryCheckInId = Sentry.captureCheckIn({
monitorSlug: "***",
status: "in_progress",
});
}
context.log.verbose(`Sending POST request to ${API_SERVER_URL}/api/jobs/partner-import`, timeStamp)
const response = await fetch(`${API_SERVER_URL}/api/jobs/partner-import`, {
headers: {
authorization: API_SERVER_AUTH_TOKEN,
},
method: 'POST',
})
if (!response.ok) {
if (IS_SENTRY_CRON_MONITORING_ENABLED) {
Sentry.captureCheckIn({
checkInId: sentryCheckInId,
monitorSlug: "***",
status: "error",
});
}
// It will retry [maxRetryCount] times.
// See the retry settings in ./function.json
throw new Error(
`HTTP Error API Server returned: ${response.status} ${response.statusText}, ${timeStamp}`
)
} else {
context.log.verbose(`Successfully send POST request to API server`, timeStamp)
if (IS_SENTRY_CRON_MONITORING_ENABLED) {
// 🟢 Notify Sentry your job has completed successfully:
Sentry.captureCheckIn({
checkInId: sentryCheckInId,
monitorSlug: "***",
status: "ok",
});
}
}
}
export default partnerImport
型
Package.json
{
"name": "functions",
"version": "0.1.0",
"description": "",
"scripts": {
"build": "tsc",
"watch": "tsc -w",
"prestart": "npm run build",
"start:host": "func start",
"start": "npm run start:host & npm run watch",
"emulator": "azurite --silent",
"test": "echo \"No tests yet...\""
},
"dependencies": {
"@sentry/node": "^7.58.1"
},
"devDependencies": {
"@azure/functions": "^3.0.0",
"@shared/eslint-config-node": "^0.0.0",
"@shared/prettier-config": "*",
"@types/node": "18.x",
"azure-functions-core-tools": "^4.x",
"tsconfig": "*",
"typescript": "^4.0.0"
}
}
型
//编辑/更新
还尝试使用VScode上传/部署功能应用程序。这将其更改为程序包文件部署,因此我无法在Azure控制台中查看函数。它也没有列在VScode插件的函数下,但它确实显示在工作空间>函数下。(单击部署的位置)
x1c 0d1x的数据
嗯,我还不知道这有多大的不同,但可能是由于通过“包文件”或其他东西部署?因为如果我现在使用func azure functionapp publish ..
,它确实会在函数下列出它。还不知道这有多不一样。
1条答案
按热度按时间3xiyfsfu1#
检查以下故障排除步骤是否有助于解决问题:
node_modules
文件夹和package-lock.json
文件。npm install
重新安装所有依赖项。这是为了确保所有依赖项都正确安装,并且它们之间没有冲突。npm ls
以检查依赖项的兼容性:的数据
我创建了一个简单的TimerTrigger函数并安装了Sentry包。
我可以在没有任何问题的情况下部署,如下所示:
的