使用 Express 和 Node.js 构建 API
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
使用 Insomnia 测试对 API 端点的 HTTP 请求
在之前的文章中,我们开始API使用Node.js和Express构建一个可以读写数据库的系统。
我们已经了解了如何使用网络浏览器轻松测试读取操作,因为读取操作与GET网络浏览器默认执行的请求相关联。
但当遇到更复杂的情况时,例如我们需要执行POST向端点传递数据的请求时API,我们可能需要使用更合适的HTTP客户端来简化测试。
有很多工具可以实现这个目的,但在我们的示例中,我们使用Insomnia(更多详情请点击此处)。Insomnia 是一个REST客户端,可以轻松地向HTTP服务器发送请求API并查看响应详情。
安装 Insomnia 之后,让我们向 发出GET请求localhost:4000/toys,以确保我们的后端应用程序正常工作,并且数据以API我们期望的方式从 发送回来。
我们创建一个新请求,选择GET方法并输入 URL localhost:4000/toys。
我们应该找回所有玩具的清单:
写入数据库
太棒了!这行得通。既然如此,我们就来实际发送一个请求,测试一下最新版本的代码。
如果你还记得,在上一篇文章中,我们创建了一个端点来处理POST添加新玩具的请求。
我们使用相同的 URL,localhost:4000/toys但这次我们将动词选择POST为`select` HTTP。我们还需要将新玩具的名称以JSON特定格式传递给端点。
Insomnia 有一个部分允许我们向请求中添加数据body。我们只需要选择JSON要发送的数据格式,然后输入JSON要发送的玩具名称,格式API如下:
{
"name": "Beetle"
}
有了这套设置,我们只需要点击发送。以下是返回结果:
等等,这跟我们预想的有点不一样!
我们原本期望将新玩具添加到数据库中并收到成功响应,但却收到了错误信息。请问哪里出了问题?
在这里,您可以看到使用客户端调试代码的好处HTTP。在这个例子中,我们不仅得到了错误信息,而且错误信息还为我们提供了调试问题的线索。
如果你仔细观察,会发现 Insomnia 收到了一个500状态码。这是因为我们在方法中指示 Express 执行了相应的操作server.post:
.catch(err => {
res.status(500).json({ err })
})
我们还告诉 Express 返回实际错误,因此错误被转换为JSON对象并在 Insomnia 中显示:
{
"err": {
"errno": 21,
"code": "SQLITE_MISUSE"
}
}
看来我们在尝试向数据库添加数据时发生了一些意外情况,因为这个错误直接与数据库调用有关。也许我们没有发送数据库期望的数据?
我们先来看看实际发送到数据库的内容。我们可以添加一个console.log调用来验证我们是否向数据库发送了正确的数据:
server.post('/toys', (req, res) => {
const toyInfo = req.body;
console.log("toyInfo:", toyInfo) // <-- For debugging
// ...
}
在这里,我们检查toyInfo从请求中提取出来的部分body。它应该包含玩具名称,对吗?
添加console.log语句后,我们再发出一个请求。
我们在 Insomnia 中仍然遇到同样的错误,但现在如果我们查看服务器控制台,会看到以下输出:
toyInfo: undefined
这证实了错误toyInfo确实发生undefined在这里。但为什么呢?
服务器中间件
原来,Express 在收到请求时会将其保存为JSON对象。这种对象不适合直接发送到数据库。数据库需要的是字符串,因此我们需要JSON在将对象发送到数据库之前对其进行转换。
我们如何进行这样的转换?Express 提供了一些方法可以帮助我们做到这一点,这些方法使用了一种叫做中间件的概念。
稍后我会更详细地讲解中间件,但现在我们只需知道,我们需要在服务器端添加一个中间件方法。这个方法会转换数据并将其保存回对象request,以便安全地发送到数据库。
我们需要在代码中定义端点之前,将中间件方法添加到代码中,以便所有端点都能自动使用这些方法。
我们添加的方法名为 `get_objects()` server.use(),它接受一个函数作为参数,该函数会在每个收到的请求时执行。传递给 `get_objects()` 的函数server.use()会将对象express.json()转换JSON为字符串。
server.use(express.json());
// ... route handler code below
如果我们现在再次向APIInsomnia 发出请求,我们可以确认错误已消失,并且得到了预期的响应:
此回复包含我们发送的数据,以及数据库添加的其他信息,例如项目ID和创建日期。
{
"toy": {
"id": 5,
"name": "Beetle",
"created_at": "2019-11-18 15:53:26",
"updated_at": "2019-11-18 15:53:26"
}
}
此外,如果我们查看服务器控制台,会发现它toyInfo不再是undefined原来的值,而是设置为我们在请求中传递的数据body:
toyInfo: { name: 'Beetle' }
太棒了!我们的新玩具已经成功添加到数据库了!
现在我们有了新玩具,也玩了一会儿,如果我们玩累了想把它处理掉怎么办?
我们将在以后的文章中探讨如何添加用于删除资源的端点。
我每天都会写一些关于网站开发的文章。如果您喜欢这篇文章,欢迎分享给您的朋友和同事。
订阅我的新闻简报,即可在您的收件箱中收到类似的文章。
文章来源:https://dev.to/cesareferrari/building-an-api-with-express-and-node-js-gmh


