我第一次尝试使用Node.js构建后端。我需要实现以下功能:根据提示生成图像
-> 获取图像并上传到supabase存储
-> 返回上传图像的公共URL
。我一直收到一个错误提示,暗示是来自OpenAI的认证错误(400),但我知道API密钥是有效的,甚至为了确保无误,我还生成了一个新的密钥。当我直接从前端向API发送请求时,生成功能是正常工作的,但这样会暴露API密钥。我不确定哪里出了问题。
Node.js
代码如下:
const express = require('express');const axios = require('axios');const bodyParser = require('body-parser');const fs = require('fs');const FormData = require('form-data');const { createClient } = require('@supabase/supabase-js');const app = express();const port = 3000;const apiKey = '<HIDDEN>';const supabaseUrl = '<HIDDEN>';const supabaseKey = '<HIDDEN>';const supabaseBucket = 'public/posts';const config = { headers: { 'Authorization': 'Bearer ' + apiKey, 'Content-Type': 'application/json' }};const supabase = createClient(supabaseUrl, supabaseKey);app.use(bodyParser.json());// 允许任何访问控制来源app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); next();});app.post('/generate-image', async (req, res) => { try { const { text } = req.body; // 构建对Dall-e API的请求 const response = await axios.post( 'https://api.openai.com/v1/images/generations', { prompt: text, size: "256x256", api_key: apiKey, response_format: "b64_json" }, config ); console.log("图像已创建..."); // 获取生成的图像作为base64编码的字符串 console.log("正在获取图像..."); const imageBase64 = response.data.data[0].value; // 上传图像到Supabase存储 const { data: uploadData } = await supabase.storage .from(supabaseBucket) .upload(Date.now() + '.png', imageBase64, { cacheControl: '3600', upsert: false, contentType: 'image/png', }); // 返回上传文件的公共URL res.json({ imageUrl: `${supabaseUrl}/public/${supabaseBucket}/${uploadData.Key}`, }); } catch (error) { res.status(500).json({ message: `生成图像失败 ${error}` }); }});app.listen(port, () => { console.log(`服务器正在监听端口 ${port}`);});
来自React Native应用的请求
如下:
const generateImage = async (text: any) => { try { const response = await fetch( "https://endpoint.com/generate-image", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ text }), } ); const data = await response.json(); console.log(data.imageUrl); return data.imageUrl; } catch (error) { console.error(error); return null; }};
响应
如下:
{ "message": "生成图像失败 AxiosError: 请求失败,状态码为400"}
回答:
您在请求体中发送了api_key: apiKey
,而OpenAI API并不期望接收这个参数。