将项目结构调整为前后端分离的清晰目录布局,优化了代码组织和可维护性。主要变更包括: - 将前端代码移至frontend目录 - 将后端代码移至backend目录 - 更新README.md以反映新的目录结构 - 优化.gitignore文件 - 修复部分文件路径问题
93 lines
2.5 KiB
JavaScript
93 lines
2.5 KiB
JavaScript
require('dotenv').config();
|
|
|
|
const express = require('express');
|
|
const cors = require('cors');
|
|
const https = require('https');
|
|
const signer = require('./APIGW-javascript-sdk-2.0.6/signer');
|
|
|
|
const app = express();
|
|
const PORT = 3001;
|
|
|
|
app.use(cors());
|
|
app.use(express.json());
|
|
|
|
const METASTUDIO_API_BASE = 'https://metastudio.cn-north-4.myhuaweicloud.com';
|
|
|
|
async function createOnceCodeWithAKSK() {
|
|
const accessKey = process.env.HUAWEI_AK;
|
|
const secretKey = process.env.HUAWEI_SK;
|
|
const projectId = process.env.HUAWEI_PROJECT_ID;
|
|
|
|
if (!accessKey || !secretKey) {
|
|
throw new Error('请配置环境变量: HUAWEI_AK 和 HUAWEI_SK');
|
|
}
|
|
if (!projectId) {
|
|
throw new Error('请配置环境变量: HUAWEI_PROJECT_ID');
|
|
}
|
|
|
|
const uri = `/v1/${projectId}/digital-human-chat/once-code`;
|
|
|
|
const sig = new signer.Signer();
|
|
sig.Key = accessKey;
|
|
sig.Secret = secretKey;
|
|
|
|
const req = new signer.HttpRequest(
|
|
'POST',
|
|
`${METASTUDIO_API_BASE}${uri}`,
|
|
{
|
|
'content-type': 'application/json',
|
|
'x-project-id': projectId
|
|
},
|
|
'{}'
|
|
);
|
|
|
|
const options = sig.Sign(req);
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const request = https.request(options, (res) => {
|
|
let data = '';
|
|
res.on('data', (chunk) => {
|
|
data += chunk;
|
|
});
|
|
res.on('end', () => {
|
|
if (res.statusCode !== 200) {
|
|
reject(new Error(`API调用失败: ${res.statusCode} - ${data}`));
|
|
return;
|
|
}
|
|
const response = JSON.parse(data);
|
|
resolve(response.once_code);
|
|
});
|
|
});
|
|
|
|
request.on('error', (e) => {
|
|
reject(e);
|
|
});
|
|
|
|
request.write('{}');
|
|
request.end();
|
|
});
|
|
}
|
|
|
|
app.post('/api/once-code', async (req, res) => {
|
|
try {
|
|
console.log('使用 AK/SK 认证获取授权码...');
|
|
const onceCode = await createOnceCodeWithAKSK();
|
|
res.json({ once_code: onceCode });
|
|
} catch (error) {
|
|
console.error('获取授权码失败:', error);
|
|
res.status(500).json({
|
|
error_code: 'INTERNAL_ERROR',
|
|
error_msg: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
app.get('/health', (req, res) => {
|
|
res.json({ status: 'ok' });
|
|
});
|
|
|
|
app.listen(PORT, () => {
|
|
console.log(`后端服务已启动: http://localhost:${PORT}`);
|
|
console.log('使用 AK/SK 认证方式');
|
|
});
|