使用Node.js开发IBM Cloud Code Engine Job时导入SDK遇问题
无法导入IBM Cloud Code Engine SDK到Node.js项目
我正尝试创建一个使用Code Engine SDK的Node.js Job,用来按需触发其他Job。按照IBM文档操作时,没法成功导入Code Engine SDK。
我已经执行了以下命令安装两个IBM Cloud SDK:
npm install ibm-cloud-sdk-core npm install @ibm-cloud/ibm-code-engine-sdk
安装成功,在node_modules/里能看到相关文件,也能正常从核心SDK导入IamAuthenticator模块:
import { IamAuthenticator } from 'ibm-cloud-sdk-core';
但尝试导入Code Engine SDK中的CodeEngineV2时遇到多种错误:
- 按IBM文档给出的路径导入,提示找不到模块
- 添加
.js后缀后,提示需要在package.json中设置"type": "module" - 设置后又出现“require is not defined”的错误
附相关代码文件:
index.js
import { IamAuthenticator } from 'ibm-cloud-sdk-core'; import { CodeEngineV2 } from '@ibm-cloud/ibm-code-engine-sdk/dist/code-engine/v2'; async function main() { try { // Load secrets from Code Engine const iamAuthenticator = new IamAuthenticator({ apikey: process.env.CODE_ENGINE_API_KEY }); console.log(`Batch job completed successfully`); } catch (error) { console.error('Error processing batch job:', error); } } main();
package.json
{ "name": "code-engine-test-repo", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "scripts": { "start": "node index.js", "pretty": "prettier --write \"./**/*.{js,jsx,json}\"" }, "author": "", "license": "ISC", "devDependencies": { "node-env-run": "^4.0.2" }, "engines": { "node": ">=14.0.0" }, "dependencies": { "@ibm-cloud/ibm-code-engine-sdk": "^3.1.0", "ibm-cloud-sdk-core": "^4.0.5" } }
解决方案
问题出在导入路径和ES模块兼容性上,按以下步骤修复:
- 修正CodeEngineV2的导入路径
不要直接导入dist目录下的文件,SDK本身提供了标准导出,直接从包根目录导入即可:
import { CodeEngineV2 } from '@ibm-cloud/ibm-code-engine-sdk';
解决"require is not defined"错误
该错误是因为SDK内部混用了CommonJS和ES模块语法,而你的项目开启了ES模块模式("type": "module"),可以二选一处理:方案一:改用CommonJS语法
删除package.json中的"type": "module",将index.js的导入语法改为require:const { IamAuthenticator } = require('ibm-cloud-sdk-core'); const { CodeEngineV2 } = require('@ibm-cloud/ibm-code-engine-sdk');这种方式更适配IBM SDK的现有打包结构。
方案二:保留ES模块模式
安装esm包来兼容混合模块语法:npm install esm修改
package.json的启动脚本:"scripts": { "start": "node -r esm index.js" }
完善SDK客户端初始化
修复导入后,记得正确实例化CodeEngine客户端(当前代码仅创建了认证器,未初始化SDK):
// 以ES模块模式为例 import { IamAuthenticator } from 'ibm-cloud-sdk-core'; import { CodeEngineV2 } from '@ibm-cloud/ibm-code-engine-sdk'; async function main() { try { const authenticator = new IamAuthenticator({ apikey: process.env.CODE_ENGINE_API_KEY }); // 根据你的部署区域调整serviceUrl const codeEngineService = new CodeEngineV2({ authenticator, serviceUrl: 'https://api.us-south.codeengine.cloud.ibm.com/v2' }); // 这里添加触发Job的逻辑,比如调用createJobRun方法 // const jobRun = await codeEngineService.createJobRun({ // projectId: '你的项目ID', // jobName: '目标Job名称' // }); console.log(`Batch job completed successfully`); } catch (error) { console.error('Error processing batch job:', error); } } main();
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

