我正在平板电脑和 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 是一个用于为传入请求设置和配置 http 服务器的库。它不会向其他服务器发出传出请求。因此,您的客户端代码根本不是客户端。
这里有几个问题:
127.0.0.1
引用您的本地设备,因此您的客户端在使用127.0.0.1
时引用自身。在您的客户端中
app.get("http://127.0.0.1:3000/boxes")
不是数据请求。它尝试为传入请求设置快速路由,就像您声明第二个服务器一样。但是,它甚至没有正确完成,因为您只会使用那里的路径。对于客户端向其他服务器发出请求,您需要使用实际执行 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 上的传入连接。 ,传入连接将被阻止(出于安全原因)。
关于javascript - Node.js 客户端无法看到来自 Express 服务器的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53989877/