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

Next.js中@azure/storage-blob导入错误的排查与解决

解决@azure/storage-blob导入错误:StorageSharedKeyCredential、SASProtocol等未导出问题

你遇到的导入错误是由于**@azure/storage-blob v12及以上版本重构了API导出结构**,这些类和方法不再从主包@azure/storage-blob导出,需要从对应的子模块引入。

1. 修正导入路径

将原来的导入语句替换为以下内容,从对应子模块导入所需对象:

"use client"; 

import { BlobServiceClient } from '@azure/storage-blob';
import { StorageSharedKeyCredential } from '@azure/storage-blob/storage-shared-key-credential';
import { SASProtocol, ContainerSASPermissions, generateBlobSASQueryParameters } from '@azure/storage-blob/sas';

2. 修复代码中的小问题

  • 修正拼写错误:vidoe_name改为video_name
  • 移除"use client"后的多余分号

修改后的完整代码

"use client"; 

import { BlobServiceClient } from '@azure/storage-blob';
import { StorageSharedKeyCredential } from '@azure/storage-blob/storage-shared-key-credential';
import { SASProtocol, ContainerSASPermissions, generateBlobSASQueryParameters } from '@azure/storage-blob/sas';

const accountName: string = process.env.AZURE_ACCOUNT_NAME || "";
const accountKey: string = process.env.AZURE_BLOB_ACCESS_KEY || "";

const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);

console.log("Shared key: ", sharedKeyCredential);

const blobServiceClient = new BlobServiceClient(`https://${accountName}.blob.core.windows.net`, sharedKeyCredential);

const containerName: string = process.env.AZURE_CONTAINER_NAME || "";

const container_client = blobServiceClient.getContainerClient(containerName);
const THUMBNAIL_FOLDER_PATH: string = "/thumbnail/"
const VIDEO_FOLDER_PATH: string = "/video/"


async function get_thumbnail_from_blob(thumbnail_name: string) {
    const blob_client = container_client.getBlobClient(thumbnail_name);
    const blob_data = await blob_client.download(0);
    return blob_data;
}

async function get_video_from_blob(video_name: string) {
    const blob_client = container_client.getBlobClient(video_name);

    const sasOptions = {
        containerName,
        protocol: SASProtocol.Https,
        permission: ContainerSASPermissions.parse('r').toString(),
        expiresOn: new Date(new Date().valueOf() + 3600 * 1000)
    };

    const sasToken = generateBlobSASQueryParameters(sasOptions, sharedKeyCredential).toString();
    return `${blob_client.url}?${sasToken}`;
}


const getBlobs = async(containerBlobName: string) => {
    const blobs: Array<any> = [];
    const blob_names: string[] = [];

    const blob_list = container_client.listBlobsFlat();

    const loader = {
        [THUMBNAIL_FOLDER_PATH]: get_thumbnail_from_blob,
        [VIDEO_FOLDER_PATH]: get_video_from_blob
    };

    const loaderFunction = loader[containerBlobName];

    for await (const blob of blob_list) {
        blobs.push(await loaderFunction(blob.name));
        blob_names.push(blob.name);
    }

    return [blobs, blob_names]
}


export const get_thumbnails = async () => {
    const [thumbnails, thumbnail_names] = await getBlobs(THUMBNAIL_FOLDER_PATH);
    console.log("thumbnail: ", thumbnail_names);
    return [thumbnails, thumbnail_names]
}


export const get_videos = async () => {
    const [videos, video_names] = await getBlobs(VIDEO_FOLDER_PATH);
    return [videos, video_names]
}

关键安全提醒

你当前使用"use client"将Azure账户密钥暴露在前端代码中,这会导致密钥泄露,任何人都可通过浏览器开发者工具获取并操作你的存储账户。正确做法是将生成SAS Token的逻辑移到Next.js的API路由(服务器端),前端通过调用API获取视频/缩略图的访问URL,而非直接在客户端处理密钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:18:14