如何修复NativeScript AWS S3上传中的`t.hrtime is not a function`错误?
解决NativeScript上传AWS S3时的
TypeError: t.hrtime is not a function错误 这个问题我之前在NativeScript项目里踩过坑,本质原因很明确:标准的aws-sdk是为Node.js环境设计的,它依赖了Node专属的API(比如process.hrtime),但NativeScript的移动端运行环境并不支持这些Node.js特有的API,所以才会抛出这个缺失方法的错误。你同时引入aws-sdk和nativescript-aws的操作,反而会因为标准SDK的兼容性问题触发报错。
下面给你两个可行的解决方向,优先推荐第一个:
方案一:移除标准aws-sdk,使用nativescript-aws完成上传
nativescript-aws是专门为NativeScript适配的AWS工具包,已经处理了移动端环境的兼容性问题,完全可以替代标准SDK实现S3上传。
步骤1:卸载标准AWS SDK
先把冲突的依赖去掉:
npm uninstall aws-sdk # 如果你用yarn的话: yarn remove aws-sdk
步骤2:调整上传代码为nativescript-aws的用法
注意:原代码里Body: this.licenseFileName是错误的——Body需要传入文件的二进制内容,而不是文件名,这也是潜在的问题点。下面是修正后的完整示例:
首先在App启动时初始化AWS配置(比如app.js/main.ts):
import { AWSAuth, AWSConfig } from 'nativescript-aws'; // 替换成你的AWS凭证和区域 AWSConfig.initialize({ accessKeyId: '你的AWS Access Key', secretAccessKey: '你的AWS Secret Key', region: '你的S3存储桶区域(比如us-east-1)' });
然后修改上传逻辑:
import { AWSS3 } from 'nativescript-aws'; import * as fs from '@nativescript/core/file-system'; // 引入文件系统模块 async function uploadLicenseToS3() { try { const s3 = new AWSS3(); // 从文件路径读取二进制内容 const file = fs.File.fromPath(this.licenseFileName); const fileContent = await file.read(); const uploadResult = await s3.putObject({ Bucket: AWS_S3_bucket, Key: 'license', Body: fileContent, ContentType: 'application/pdf' }); console.log('文件上传成功:', uploadResult); return true; } catch (err) { console.log('文件上传失败:', err); return false; } }
方案二:保留标准aws-sdk,添加Node API模拟插件(不推荐)
如果因为某些原因必须使用标准aws-sdk,可以通过nativescript-nodeify插件模拟缺失的Node.js API,但这种方法可能会引入其他兼容性问题,仅作为备选:
- 安装插件:
npm install nativescript-nodeify --save
- 在项目入口文件(比如
app.js)顶部添加:
require('nativescript-nodeify');
之后再尝试运行原上传代码,但依然要注意修正Body参数的问题。
内容的提问来源于stack exchange,提问作者Paul Castro
相关产品推荐
相关产品推荐

