Files
dukang/scripts/configure-oss-cors.mjs
2026-07-07 22:45:49 +08:00

90 lines
2.6 KiB
JavaScript

/**
* 为 OSS Bucket 配置浏览器直传所需的 CORS 规则。
* 使用 server/dukang-api/.env 中的 OSS 凭证。
*
* 用法:pnpm oss:cors
* 可选环境变量 OSS_CORS_ORIGINS(逗号分隔),默认包含本地 H5 / admin 端口。
*/
import { readFileSync, existsSync } from 'node:fs';
import { resolve, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import { createRequire } from 'node:module';
const __dirname = dirname(fileURLToPath(import.meta.url));
const apiRoot = resolve(__dirname, '../server/dukang-api');
const require = createRequire(resolve(apiRoot, 'package.json'));
const OSS = require('ali-oss');
const envPath = resolve(apiRoot, '.env');
function loadEnvFile(path: string) {
if (!existsSync(path)) return;
for (const line of readFileSync(path, 'utf8').split(/\r?\n/)) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
const eq = trimmed.indexOf('=');
if (eq <= 0) continue;
const key = trimmed.slice(0, eq).trim();
let value = trimmed.slice(eq + 1).trim();
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
value = value.slice(1, -1);
}
if (process.env[key] === undefined) process.env[key] = value;
}
}
loadEnvFile(envPath);
const {
OSS_ACCESS_KEY_ID: accessKeyId,
OSS_ACCESS_KEY_SECRET: accessKeySecret,
OSS_BUCKET: bucket,
OSS_REGION: region = 'oss-cn-hangzhou',
OSS_CORS_ORIGINS,
} = process.env;
if (!accessKeyId || !accessKeySecret || !bucket) {
console.error('请在 server/dukang-api/.env 配置 OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、OSS_BUCKET');
process.exit(1);
}
const defaultOrigins = [
'http://localhost:5173',
'http://localhost:5174',
'http://localhost:5175',
'http://127.0.0.1:5173',
'http://127.0.0.1:5174',
'http://127.0.0.1:5175',
'http://localhost:5173/user',
'http://localhost:5174/shop',
'http://localhost:5175/partner',
'https://user.runxian.top',
];
const allowedOrigin = (OSS_CORS_ORIGINS ?? defaultOrigins.join(','))
.split(',')
.map((s) => s.trim())
.filter(Boolean);
const client = new OSS({
region,
accessKeyId,
accessKeySecret,
bucket,
});
const rules = [
{
allowedOrigin,
allowedMethod: ['GET', 'POST', 'PUT', 'HEAD'],
allowedHeader: ['*'],
exposeHeader: ['ETag', 'x-oss-request-id'],
maxAgeSeconds: 600,
},
];
console.log(`配置 Bucket「${bucket}」CORS,允许来源:`);
for (const origin of allowedOrigin) console.log(` - ${origin}`);
await client.putBucketCORS(bucket, rules);
console.log('CORS 规则已写入。若 H5 端仍直传 OSS,请确认来源域名已包含在列表中。');