在Node.js中使用Needle来发送HTTP请求

1,046 阅读5分钟

在处理后端时,有些情况下我们需要向其他API发出HTTP请求以获取信息。在Node.js中有很多不同的包可以帮助我们解决这个问题,比如node-fetchAxios

今天我们来看看另一个叫Needle的包,看看为什么我们应该使用它而不是Axios这样的东西。

Needle是一个为Node制作的HTTP客户端,它可以帮助我们向外部资源发送HTTP请求以检索数据。这应该是在后端使用的,在这种情况下,你不想把敏感信息(如API密钥)暴露给客户端应用程序。

让我们看看这个包是如何实际工作的。在本教程中,我们将使用一个假的REST API(JSONPlaceholder),通过我们的服务器与Needle进行HTTP请求来提供数据。

为什么你要使用Needle

我选择Needle而不是Axios的原因是,Needle是为后端制作的,而Axios是为前端和后端制作。并不是说Axios是一个糟糕的软件包;我经常使用这两个软件包,它们都很不错。但Needle的具体用例是在后端,正如它的标语所说,"Nodelands中最精简、最漂亮的HTTP客户端"。

Needle是由Node特定的库组成的,这意味着它不能在前端的浏览器中工作。如果我们仔细看一下Needle在其请求中默认设置的User-Agent 头,它被设置为运行中的Node平台和版本。这意味着Needle是为了在Node上运行,并使用尺寸较小的Node包来执行请求。这使得这个包对后端来说不那么臃肿。

另外,与Axios相比,Needle的软件包大小更小。虽然现在包的大小可能不那么重要,但像Needle这样较小的包的大小对优化来说是很好的。如果包的大小对你来说是个问题,那么在后端使用Needle,在前端使用Axios是有意义的。

当你在后端工作时,你肯定知道这些代码不会以任何方式在前端使用,那么为什么不节省一些空间,使用Needle而不是Axios?

使用Axios和Needle是很相似的。在正常的使用中,你不会发现性能上的差异,但当你真的要优化东西以使你的服务器更快,使用像Needle这样的轻量级包是一个不错的选择。

创建一个Node.js服务器样本

让我们看看Needle的运行情况。我们的第一步是建立一个Node和Express的样本服务器。

要做到这一点,请进入一个安全的项目工作区文件夹,输入以下命令,为我们的项目设置package.json

npm init -y

现在让我们像这样安装Needle和Express软件包。

npm install needle express

接下来,创建一个名为index.js 的新文件,并在终端使用node index 来运行它。我强烈建议使用nodemon ,因为一旦你对文件进行了修改,它就会自动重新加载服务器。

使用下面的命令安装它(你只需要在每台机器上安装一次)。

npm install -g nodemon

设置一个Express服务器样本

现在,进入index.js 文件,并使用下面的代码来设置一个原始的Express应用程序。我们还将在这里导入Needle,以便进一步使用。

const express = require("express");
const needle = require("needle");
const app = express();
const PORT = process.env.PORT || 8080;

app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

在上面的代码中,process.env.PORT || 8080 意味着如果环境变量中没有提供端口,服务器将在8080端口运行。当你在像Heroku这样的服务上部署,并且你需要某种方式在本地测试服务器时,这就相当有用。

设置路由并与Needle一起工作

现在让我们创建一个路由,当发送一个请求时,它将从一个假的API返回一个响应。这将是一个简单的GET 请求。

app.get("/posts", async (req, res) => {
  try {
    const response = await needle(
      "get",
      "https://jsonplaceholder.typicode.com/posts"
    );
    console.log(response.body);
    res.json(response.body);
  } catch (err) {
    console.log(err);
    res.status(500).json({ message: "Internal server error" });
  }
});

让我们看看在上面的代码中我们在做什么。首先,我们在路由/posts ,并使用一个异步回调函数来设置一个Express路由。然后,我们从Needle发出一个GET 请求,并指定我们要发送HTTP请求的URL。

我们的响应被存储在response.body ,我们使用res.json() 将这个响应发回给用户。

如果在发出请求时出了什么问题,我们就使用catch 块,如果出了问题,就发送一个错误信息作为响应。

现在,如果你使用 [http://localhost:8080/posts](http://localhost:8080/posts)使用Postman等HTTP客户端或简单地使用浏览器,你会得到一个包含大量JSON格式的虚拟帖子的响应。

我们还可以做很多事情,比如检查HTTP状态代码。让我们把我们从请求中得到的状态代码作为响应返回。

res.status(response.statusCode).json(response.body);

在上面的代码段中,我们只是从express中添加了.status() 方法来返回状态码作为响应。

同样地,你可以向请求传递头信息以发送请求数据,如API密钥

const response = await needle(
  "get",
  "https://jsonplaceholder.typicode.com/posts",
  { headers: { "x-my-custom-key": "abc123" } }
);

而你可以像这样解析响应头信息。

console.log(response.headers);

结论

Needle已经存在很多年了,甚至在Axios之前就存在了。请务必亲自尝试一次!今年,越来越多的人开始使用Needle,这表明开发者们希望得到更多的优化。向它迈出的第一步是使用尺寸较小的软件包。

然而,如果你只是个学生,或者你正在做一个不一定需要优化的简单项目,我看不出使用Axios和Needle有什么区别。我认为优化部分在大规模的生产级应用中更有用,因为在这些应用中,开发人员需要尽可能地保持干净。

The postUsing Needle to send HTTP requests in Node.jsappeared first onLogRocket Blog.