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

React Native Expo集成@azure/cosmosdb与isomorphic-webcrypto遇难题求助

解决Expo React Native中Azure Cosmos DB SDK的依赖问题及替代方案

一、解决现有依赖的问题

1. 修复expo-random废弃警告

isomorphic-webcrypto依赖旧版expo-random导致警告,用patch-package修改依赖代码:

  • 安装patch-package:npm install patch-package --save-dev(或yarn)
  • 找到node_modules/isomorphic-webcrypto/src/random.js文件,将原代码中import * as Random from 'expo-random'替换为import * as Crypto from 'expo-crypto',同时把Random.getRandomBytes替换为await Crypto.getRandomBytesAsync(注意调整函数为异步逻辑)
  • 执行npx patch-package isomorphic-webcrypto生成补丁,后续安装依赖时会自动应用该补丁

2. 解决EAS构建的依赖冲突

  • 先运行expo install重新安装所有依赖,让Expo自动匹配兼容版本
  • 若仍有冲突,使用npm的overrides或yarn的resolutions强制指定依赖版本:
    • npm:在package.json中添加:
      "overrides": {
        "isomorphic-webcrypto": "^2.3.8",
        "@azure/cosmos": "^3.17.3" // 选择与Expo兼容的版本
      }
      
    • yarn:在package.json中添加:
      "resolutions": {
        "isomorphic-webcrypto": "^2.3.8",
        "@azure/cosmos": "^3.17.3"
      }
      
  • 再次运行expo doctor检查,根据提示调整其他依赖版本

二、替代Azure Cosmos DB SDK的访问方式

1. 后端代理(推荐)

搭建简单的Node.js后端API,用@azure/cosmos SDK操作Cosmos DB,前端Expo应用通过HTTP请求(如axios)调用该API。此方式彻底规避前端依赖兼容性问题,还能统一处理权限与数据逻辑:

  • 后端示例(Node.js + Express):
    const express = require('express');
    const { CosmosClient } = require('@azure/cosmos');
    const app = express();
    const client = new CosmosClient({ endpoint: YOUR_COSMOS_ENDPOINT, key: YOUR_COSMOS_KEY });
    
    app.get('/items', async (req, res) => {
      const container = client.database('your-db').container('your-container');
      const { resources } = await container.items.readAll().fetchAll();
      res.json(resources);
    });
    
    app.listen(3000);
    
  • 前端直接用axios.get('https://your-api-domain/items')获取数据

2. 直接调用Cosmos DB REST API

手动实现Cosmos DB的REST请求签名逻辑,无需依赖SDK。需自行处理请求头的签名生成,虽繁琐但可完全控制请求:

  • 示例:获取容器中的项
    const endpoint = 'YOUR_COSMOS_ENDPOINT';
    const key = 'YOUR_COSMOS_KEY';
    const resourceType = 'docs';
    const resourceLink = 'dbs/your-db/colls/your-container';
    const date = new Date().toUTCString();
    
    // 生成签名(需自行实现HMAC-SHA256签名逻辑)
    const signature = generateCosmosSignature(key, date, resourceType, resourceLink);
    const authHeader = `type=master&ver=1.0&sig=${signature}`;
    
    const response = await fetch(`${endpoint}/${resourceLink}/docs`, {
      headers: {
        'Authorization': authHeader,
        'x-ms-date': date,
        'x-ms-version': '2021-05-15'
      }
    });
    const data = await response.json();
    

内容的提问来源于stack exchange,提问作者Stuart Ridout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:35:14