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

如何将Base64字符串从原生Javascript传递到Node.js?

问题原因与解决办法

你的问题核心是FileReader是异步操作——如果你的fetch请求写在load回调函数外面,发起请求时logoUri还没被赋值(因为reader还没完成文件读取),所以传过去的自然是undefined。

解决办法一:把fetch请求放到load回调里

直接在拿到Base64字符串的回调里发起POST请求,确保数据已经准备好:

const file = logo.files[0];
if(file.size <= 2e+6){
    const reader = new FileReader();
    reader.addEventListener('load', () => {
        const logoUri = reader.result;
        console.log(logoUri);
        // 在这里发起fetch请求
        fetch('/你的后端接口地址', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({ logo: logoUri })
        })
        .then(response => response.json())
        .then(data => console.log('上传成功:', data))
        .catch(error => console.error('上传失败:', error));
    });
    reader.readAsDataURL(file);
}

解决办法二:用Promise封装FileReader(更优雅的异步处理)

如果代码逻辑复杂,不想把所有代码塞在回调里,可以把FileReader包装成Promise,用async/await来处理:

// 封装FileReader为Promise函数
function fileToBase64(file) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = () => resolve(reader.result);
        reader.onerror = reject;
        reader.readAsDataURL(file);
    });
}

// 调用逻辑
async function uploadLogo() {
    const file = logo.files[0];
    if(file.size <= 2e+6){
        try {
            const logoUri = await fileToBase64(file);
            console.log(logoUri);
            // 发起POST请求
            const response = await fetch('/你的后端接口地址', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ logo: logoUri })
            });
            const data = await response.json();
            console.log('上传成功:', data);
        } catch (error) {
            console.error('处理失败:', error);
        }
    }
}

// 触发上传(比如绑定到按钮点击事件)
// document.getElementById('upload-btn').addEventListener('click', uploadLogo);

额外注意点:

  • 后端Node.js接口要正确解析JSON请求体,比如Express框架要加express.json()中间件
  • MongoDB存储Base64字符串时,字段类型设为String即可,MongoDB的String类型支持足够长度的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:33:31