首页 > 解决方案 > 如何将 JSON 数据传递到 Express REST API

问题描述

我正在使用 Node/Express 创建一个 REST API,并且有一个关于设置 API 以及如何将 JSON 文件合并到其中的问题。我有以下作为我想查找的 JSON 数据的示例,它包括 ID 号、型号和颜色:

{“1”:{“car_model”:“法拉利”,“颜色”:“银色”},“2”:{“car_model”:“保时捷”,“颜色”:“绿色”},“3”:{ “汽车模型”:“凯美瑞”,“颜色”:“蓝色”} }

现在,我想让 GET 路线返回 JSON 列表中的所有汽车并返回 ID、颜色和型号。我不确定如何将 JSON 数据合并到请求中(比如它位于我的硬盘驱动器路径/JSON 中)

我将以下代码设置为 API 的基础:

// BASE SETUP
// =============================================================================

// call the packages we need
var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser = require('body-parser');

// configure app to use bodyParser()
// this will let us get the data from a POST
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var port = process.env.PORT || 8080;        // set our port


// ROUTES FOR OUR API
// =============================================================================
var router = express.Router();              // get an instance of the express Router

// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router.get('/endpoint_get', function(req, res) {
    res.json({ message: 'hooray! welcome to our api!' });   
});

router.post('/endpoint_post', function(req, res) {
    res.json({ message: 'hooray! welcome to our api!' });   
});


// REGISTER OUR ROUTES -------------------------------
// all of our routes will be prefixed with /endpoint.com
app.use('/endpoint.com/', router);

// START THE SERVER
// =============================================================================
app.listen(port);
console.log('Magic happens on port ' + port);

不一定要使用此代码,我希望任何人提供一些指导或帮助,或者希望提供一个示例,说明如何将 JSON 数据(来自某个随机文件)合并到 HTTP 请求中。谢谢

标签: javascriptnode.jsjsonrestexpress

解决方案


一种选择是使用节点 fs(文件系统)。

一种选择是将端点转换为异步函数。

在每个请求中,使用 fs.open() 打开文件。根据您的要求,读取整个文件或提供要读取的偏移量。

JSON.parse()然后用, 格式解析数据并返回。


另一种选择是在启动时执行上述所有步骤,将文件的内容保存到某种存储中。然后您可以绕过请求处理中从磁盘读取的慢速。

这是来自节点文档的一些示例代码。我建议看看不同的选项。

我还建议使用返回承诺(或承诺回调)的方法。这样,您访问它的代码就可以对其进行干净的排序。

fs.open('/open/some/file.txt', 'r', (err, fd) => {
  if (err) throw err;
  fs.fstat(fd, (err, stat) => {
    if (err) throw err;
    // use stat

    // always close the file descriptor!
    fs.close(fd, (err) => {
      if (err) throw err;
    });
  });
});

推荐阅读