You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React与Express开发Google Vision API上传服务遇代理错误求助

解决React + Express对接Google Vision API时的代理ECONNRESET错误

嘿,我看到你在做基于React和Express的图片上传服务,对接Google Vision API时遇到了代理连接重置的问题——这个错误我之前也碰到过,大概率是代理配置、后端服务状态或者端口冲突搞的鬼,给你几个具体的排查和解决方向:

  • 先确认Express后端真的在运行
    这个错误最常见的原因就是你的Express服务器压根没启动,或者跑错了端口。先检查你是不是已经用node server.js(或者你后端的入口文件名)启动了服务,而且后端监听的确实是localhost:3000吗?如果后端跑在别的端口(比如3001),那你的代理配置肯定不对,自然连不上。

  • 修正React的代理配置(避免端口冲突)
    如果你是用Create React App搭的前端,默认开发服务器就跑在3000端口,这时候你把代理也指向http://localhost:3000,相当于自己代理自己,不冲突才怪!
    有两种解决办法:

    1. 换后端端口:把Express后端改到3001端口,然后在前端的package.json里把"proxy"字段改成"proxy": "http://localhost:3001",这样前端的/upload请求就会正确代理到后端的3001端口。
    2. 用Express托管前端静态文件:如果你非要让前后端用同一个端口,那直接让Express来托管React的静态资源就行,不需要再用Create React App的开发服务器。具体做法是:
      在Express里添加静态文件托管的代码:
      const path = require('path');
      // 托管React build后的静态文件
      app.use(express.static(path.join(__dirname, 'client/build')));
      
      // 处理/upload的POST请求
      app.post('/upload', (req, res) => {
        // 这里写你的文件上传逻辑和Google Vision API调用代码
      });
      
      之后你只需要启动Express服务,访问localhost:3000就能看到前端页面,同时/upload请求会直接被Express处理,完全不需要代理了。
  • 确保后端能正确解析文件上传请求
    就算代理配置对了,如果后端没法解析文件上传的格式,也可能导致连接重置。因为是文件上传,你需要用multer中间件来处理multipart/form-data格式的请求:
    首先安装multer:

    npm install multer
    

    然后在Express里配置:

    const multer = require('multer');
    // 设置临时存储上传文件的目录
    const upload = multer({ dest: 'uploads/' });
    
    // 用upload.single('image')来处理单文件上传,'image'对应表单里文件输入框的name属性
    app.post('/upload', upload.single('image'), (req, res) => {
      // req.file就是上传的图片文件,在这里调用Google Vision API即可
      console.log('上传的文件:', req.file);
      // 你的Google Vision API调用逻辑...
    });
    

    同时在React的表单里,一定要设置encType="multipart/form-data",不然后端没法解析文件:

    <Form onSubmit={this.handleSubmit} encType="multipart/form-data">
      <FormGroup row>
        <Label for="imageUpload" sm={2}>上传图片</Label>
        <Col sm={10}>
          <Input type="file" name="image" id="imageUpload" />
        </Col>
      </FormGroup>
      <Button type="submit">提交分析</Button>
    </Form>
    
  • 检查端口是否被其他程序占用
    有时候3000端口可能被其他进程占了,导致你的Express或者React服务没真正启动在这个端口上。你可以用命令排查:

    • Windows系统:netstat -ano | findstr :3000
    • macOS/Linux系统:lsof -i :3000
      如果发现有其他进程占用,杀掉它或者给你的服务换个端口就行。

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

火山引擎 最新活动