首页 > 解决方案 > 由nodejs express部署的Flutter Web应用程序会更改IP

问题描述

我有一个案例,我将 nodejs express 作为后端以及由颤振在同一节点中构建的一些前端静态内容。后端有一些发出请求的路由。这个运行的设备是一个树莓派,它可能会改变 IP。当来自后端的某些 IP 的颤动请求时,整个应用程序会在 raspi 更改 IP 时中断。静态内容有什么方法可以从后端动态请求吗?

带有静态内容的后端:

app.use(express.static(path.join(__dirname, 'public-flutter')))

app.get('/someEndPath', (req, res) => {
   res.send('some response')
})

app.listen(port, () => {
   console.log(`app listening at http://localhost:4000`)
})

和颤振客户端:

Future<String> getSomething() async {
   String url = '192.168.1.10:4000'; //<-- Works fine now, until the device changes IP
   final path = 'someEndPath';
   final Map<String, String> _headers = {
      'Accept': 'application/json',
      'Access-Control-Allow-origin': '*'
   };
   http.Response response =
       await http.get(Uri.http(url, path), headers: _headers);
   if (response.statusCode == 200) {
     //print(response.body);
     return 'Something, not important';
   } else {
     print('no good response code');
     return null;
   }
}

标签: node.jsflutterexpresswebstatic

解决方案


我现在可以看到,我可能对我的问题的解释很糟糕。无论如何,我现在有了我应该早点想到的解决方案。要动态获取 IP(非硬编码),您可以使用 Darts Uri 类中的 Uri.base。当客户端是浏览器时,Uri.base 是当前页面。Uri.base = window.location.href。如果客户端不是浏览器,则它是当前工作目录。

Future<String> getSomething() async {
      String url = "${Uri.base.host}:${Uri.base.port}"; //<-- Solution
      final path = 'someEndPath';
      final Map<String, String> _headers = {
         'Accept': 'application/json',
         'Access-Control-Allow-origin': '*'
      };
      http.Response response =
          await http.get(Uri.http(url, path), headers: _headers);
      if (response.statusCode == 200) {
        return 'Something, not important';
      } else {
        print('no good response code');
        return null;
      }
    }

但是请注意,在本地开发时,flutter 会打开一个带有 url localhost:somePort 的 chrome 页面。如果您的后端不在本地计算机上,您将需要对地址进行硬编码,而不是像解决方案那样。


推荐阅读