【问题标题】:Node.js client can't see data from Express serverNode.js 客户端无法看到来自 Express 服务器的数据
【发布时间】:2023-12-17 00:21:01
【问题描述】:

我正在平板电脑和 PC 之间设置客户端/服务器通信。我的客户端无法从服务器获取任何数据,我做错了什么。

我的 PC 运行的是 Node.js 服务器(使用 Express),而我的平板电脑运行的是一个用 Node.js 编写的客户端(使用 Express)。我可以通过浏览器访问服务器并获取数据,但不能通过 javascript 代码。

我的服务器代码是:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('App requested a connection');
});

app.listen(3000, () => console.log('Listening on port 3000!'));

app.get("/boxes", function (req, res)
{
  //res.send(req.params[0]);
    res.send("All boxes are in the basement");

});

我的客户代码是:

const express = require('express');
const app = express();

console.log("Client working ...");

app.get("http://127.0.0.1:3000/boxes", function (req, res)
{
    console.log("inside...");
    console.log(res);
});

客户端应该返回“所有盒子都在地下室”,当我使用浏览器时我会得到这个,但如果我运行客户端代码它就不起作用。我从客户那里得到的唯一消息是“客户正在工作……”。

有人知道我做错了什么吗?

干杯

【问题讨论】:

  • Express 不是客户端。使用 Request -> npmjs.com/package/request 之类的东西来处理客户端请求。
  • http://127.0.0.1:3000 不是设备本地的吗?

标签: javascript node.js express client communication


【解决方案1】:

Express 是一个用于为传入请求设置和配置 http 服务器的库。它不会向其他服务器发出传出请求。所以,你的客户端代码根本就不是客户端。

这里有几个问题:

  1. 127.0.0.1 指的是您的本地设备,因此您的客户端在使用 127.0.0.1 时指的是它自己。

  2. 在您的客户端中,app.get("http://127.0.0.1:3000/boxes") 不是数据请求。这会尝试为传入请求设置 Express 路由,就好像您要声明第二台服务器一样。但是,它甚至没有正确完成,因为您只会使用那里的路径。

  3. 对于客户端向其他服务器发出请求,您需要使用实际执行 http 请求的库调用。例如,您可以这样做:

代码:

const rp = require('request-promise');
rp.get("http://ipaddressOfServer:3000/boxes").then(data => {
    // have response here
}).catch(err => {
    // error here
});

我选择使用request-promise 库,但是有多种不同的方式可以发出http 请求。也可以使用http.get()(低级)、request()(来自请求库)或axios()来自axios库等...

请注意,您的服务器所在的计算机(假设它正在运行桌面操作系统)可能还必须关闭其本地防火墙(例如 Windows 防火墙)或设置特定规则以允许端口 3000 上的传入连接。没有那个,传入的连接将被阻止(出于安全原因)。

【讨论】:

  • 好的,我在我的电脑上运行了代码(客户端和服务器),我现在使用了“请求”并且它工作了:-),谢谢你的帮助。
  • 好的,我在我的电脑上运行了代码(客户端和服务器),我现在使用了“请求”并且它工作了:-),谢谢你的帮助。有谁知道让我的平板电脑通过本地 WiFi 网络查看我的电脑的最佳方法是什么?
  • @user1959656 - 您必须使用服务器的本地 IP 地址(不是 127.0.01,但实际 IP 地址可能会不时更改,除非您将其锁定),您将必须允许桌面操作系统防火墙中的传入连接。关于这个问题的更多讨论应该在另一个问题中(关于这个主题已经有很多其他问题了,你可能可以从中学习)。
最近更新 更多