gpt4 book ai didi

node.js - Azure函数( Node 运行时)找不到模块

转载 作者:行者123 更新时间:2023-12-02 07:16:25 26 4
gpt4 key购买 nike

我们正在将timerTrigger类型函数部署到Azure函数应用程序。这是用 typescript 编写的并使用 Node 运行时。该函数本身一直在工作,直到我们添加了一个依赖项,sentry sdk(用于 cron 监视器检查),这听起来就像安装模块一样简单,确保将其作为依赖项添加到 package.json 文件中,在函数文件中导入模块并做了。在本地它工作得很好,一旦发布它就一直提示找不到某些模块。

现在奇怪的是,它一直提示“其他”模块,例如“调试”和“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

包.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 插件中的“函数”下,但它确实显示在“工作区”>“函数”下。 (从我点击部署的地方)

enter image description here

嗯,我不确定这有什么不同,但可能是由于通过“包文件”或其他方式进行部署所致?因为如果我现在使用func azure functionapppublish..,它确实将其列在函数下。还不确定这有什么不同。

最佳答案

检查以下故障排除步骤是否有助于解决问题:

  • 删除 node_modules 文件夹和 package-lock.json 文件。

  • 运行npm install以重新安装所有依赖项。这是为了确保所有依赖项都正确安装并且它们之间没有冲突。

  • 我觉得 Sentry 依赖项正在影响其他依赖项,从而导致无法找到模块错误

  • 检查安装的 Sentry 依赖项的版本是否与项目中的其他依赖项兼容。

  • 在项目根目录下运行npm ls来检查依赖的兼容性:

enter image description here

  • 如果仍然出现错误,请尝试相应地升级或降级 Node 版本。

我创建了一个简单的 TimerTrigger 函数并安装了 Sentry 包。

我可以毫无问题地进行部署,如下所示:

enter image description here

关于node.js - Azure函数( Node 运行时)找不到模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76720882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com