You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写JS函数上传S3并通过Karate调用时遇语法错误求助

问题:通过Karate调用JS函数上传S3文件报错

我编写了一个JavaScript函数用于将文件上传至S3存储桶,通过Karate特性文件调用该函数时始终报错,报错信息如下:

js failed:
>>>>
01: read('D:\Personal\NTB Demo\UploadDemo\src\test\java\examples\users\s3-utils.js')
<<<<
org.graalvm.polyglot.PolyglotException: SyntaxError: Unnamed:1:62 Invalid hex digit
read('D:\Personal\NTB Demo\UploadDemo\src\test\java\examples\users\s3-utils.js')
                                                              ^

我的JavaScript函数代码:

const AWS = require('aws-sdk');
const fs = require('fs');

async function uploadImageToS3(bucketName, prefix, filePath) {
  // AWS配置
  const accessKeyId = 'your_access_key';
  const secretAccessKey = 'your_secret_key';
  const region = 'your_region';

  // 创建S3客户端
  const s3 = new AWS.S3({
    accessKeyId,
    secretAccessKey,
    region,
  });

  // 读取文件内容
  const fileContent = fs.readFileSync(filePath);

  // 生成带前缀的唯一键
  const key = prefix + 'image.jpg';

  // 上传文件到S3存储桶
  const params = {
    Bucket: bucketName,
    Key: key,
    Body: fileContent,
  };

  try {
    await s3.upload(params).promise();
    return 'OK';
  } catch (error) {
    console.error('上传图片出错:', error);
    return 'Error';
  }
}

module.exports = {
  uploadImageToS3,
};

调用该函数的Karate特性文件:

Feature: 上传图片到S3存储桶

Background:
  * def s3Utils = read('s3-utils.js')
  * def bucketName = 'your_bucket_name'
  * def prefix = 'your_prefix/'
  * def filePath = 'path_to_your_file/image.jpg'

Scenario: 带前缀上传图片到S3存储桶
  * def result = karate.call('s3Utils.uploadImageToS3', bucketName, prefix, filePath)
  * print '结果:', result

解决方案及建议

1. 修复文件路径转义问题

报错核心原因是Windows路径中的\被当成了转义字符(比如\N会被解析为十六进制转义序列),导致语法错误。解决方法二选一:

  • 将路径中的\替换为/:
    * def s3Utils = read('D:/Personal/NTB Demo/UploadDemo/src/test/java/examples/users/s3-utils.js')
    
  • 使用双反斜杠\\转义路径中的反斜杠:
    * def s3Utils = read('D:\\Personal\\NTB Demo\\UploadDemo\\src\\test\\java\\examples\\users\\s3-utils.js')
    

2. 修正Karate函数调用语法

原代码中karate.call('s3Utils.uploadImageToS3', ...)的写法错误,因为s3Utils已经是通过read加载的JS对象,直接调用其方法即可:

* def result = s3Utils.uploadImageToS3(bucketName, prefix, filePath)

由于函数是异步的,Karate会自动处理Promise,无需额外添加await(确保使用Karate最新稳定版本)。

3. 处理AWS SDK兼容性问题

Karate基于GraalVM运行JS,部分Node.js模块可能存在兼容性问题。如果aws-sdk无法正常加载,可以尝试:

  • 直接调用S3的REST API(PutObject接口),通过Karate的HTTP客户端构造上传请求
  • 改用AWS SDK的浏览器版本,避免依赖Node.js特定API

4. 确保文件路径有效性

确认filePath指向的文件真实存在,且Karate运行进程拥有读取该文件的权限。建议使用绝对路径,或相对于Karate项目根目录的相对路径。


内容的提问来源于stack exchange,提问作者Mohaiminul Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:27:31