Azure函数(节点运行时)找不到模块

z5btuh9x  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(117)

我们正在将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 ..,它确实会在函数下列出它。还不知道这有多不一样。

3xiyfsfu

3xiyfsfu1#

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

  • 删除node_modules文件夹和package-lock.json文件。
  • 运行npm install重新安装所有依赖项。这是为了确保所有依赖项都正确安装,并且它们之间没有冲突。
  • 我觉得Sentry依赖性正在影响其他依赖性,导致 * 无法找到模块错误 *。
  • 检查安装的Sentry依赖项的版本是否与项目中的其他依赖项兼容。
  • 在项目的根目录下运行npm ls以检查依赖项的兼容性:


的数据

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

我创建了一个简单的TimerTrigger函数并安装了Sentry包。
我可以在没有任何问题的情况下部署,如下所示:


相关问题