使用JS将JSON文件发送到Express服务器

18

我对JS比较陌生,我有一个JSON文件需要发送到我的服务器(Express)上,然后我可以解析它并在我正在构建的Web应用程序中使用它的内容。

这是我现在拥有的:

  • 名为data.json的JSON文件
  • 设置了Express服务器,正在本地主机上运行
  • 一些糟糕的代码:
    app.get('/search', function (req, res) {
     res.header("Content-Type",'application/json');
     res.send(JSON.stringify({/data.json/}));
    });

上面的代码中,我只是尝试将文件发送到localhost:3000/search并查看我的JSON文件,但当我访问该路径时,收到的只有{ }。有人能解释一下吗?

非常感谢任何帮助。提前致以深深的感谢。

祝好, Theo

data.json中的示例片段:

[{
    "name": "Il Brigante",
    "rating": "5.0",
    "match": "87",
    "cuisine": "Italian",
    "imageUrl": "/image-0.png"
}, {
    "name": "Giardino Doro Ristorante",
    "rating": "5.0",
    "match": "87",
    "cuisine": "Italian",
    "imageUrl": "/image-1.png"
}]

要将文件作为响应对象发送,请查看此处的接受答案:https://dev59.com/7Ww05IYBdhLWcg3wXAmF - Robert Rowntree
5个回答

33

只需确保将正确的文件作为变量要求,然后将该变量传递到您的res.send中即可!

const data = require('/path/to/data.json')

app.get('/search', function (req, res) {
  res.header("Content-Type",'application/json');
  res.send(JSON.stringify(data));
})

此外,我的个人偏好是使用res.json,因为它会自动设置标头。

app.get('/search', function (req, res) {
  res.json(data);
})

编辑:

这种方法的缺点是JSON文件只读取一次到内存中。如果您不想将文件读入内存,或者计划在磁盘上修改JSON文件,则应查看Ian's Answer


非常感谢!奇怪的是,app.get函数可以正常工作,但每当我放置`const data = require('src/data.json/')时它就会崩溃。有什么线索吗? - Theo Strauss
1
const data = require('./src/data.json') - Denis Tsoi
检查您的堆栈跟踪并查看它所说的内容以及它是否定位了文件。请记住,require函数开始在调用它的文件所在的目录中查找,而不是在应用程序的根目录中查找。 - Khauri
成功让它工作了,但现在出现了这个错误:“TypeError:路径必须是字符串或缓冲区”。你认为JSON文件格式不正确吗?谢谢再次帮助我。 - Theo Strauss
根据您提供的示例,您的JSON格式正确。这个错误可能来自于应用程序中的其他地方。检查错误堆栈跟踪以获取导致错误的行号和文件。它可能来自于对fs(文件系统)模块的不正确使用。 - Khauri
在我看来,res.json(data);res.send(JSON.stringify(data));要好得多,因为它返回的是一个JSON对象,而不仅仅是一个字符串。 - xgqfrms

9
另一种选择是使用sendFile并设置内容类型头。
app.get('/search', (req, res) => {
    res.header("Content-Type",'application/json');
    res.sendFile(path.join(__dirname, 'file_name.json'));
})

代码假设文件与JS代码在同一目录中。这个答案解释了它是如何工作的。

1
更好的是我们不必先将文件读入内存中就可以进行操作。 - The Fool

2
尝试使用 res.json(data.json) 而不是 res.send(...)。

谢谢,但这并没有解决我的问题。仍然得到“{ }”。你觉得我的JSON有问题吗? - Theo Strauss
在发送数据之前,使用console.log(data.json)查看它是否正常。 - user5480949
看起来很棒!打印到终端 - Theo Strauss
所以在终端中看起来没问题,但当你导航到页面时,你只能看到“{}”? - user5480949
非常奇怪 - Theo Strauss
搞定了!不得不使用变量而非直接路径,并且去掉 stringify。非常感谢! - Theo Strauss

0

因为__dirname解析到脚本运行的位置,所以我更喜欢使用path.resolve()

var path = require('path');

app.get('/search', (req, res) => {
    res.header("Content-Type",'application/json');
    res.sendFile(path.resolve('search/data.json'));
})

-1

先读取文件,然后将 JSON 发送到客户端。

fs.readFile('file_name.json', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
  res.send(JSON.stringify(obj));
});

嗨!非常感谢。我在我的app.get函数中嵌套了它。这就是我应该做的吗?下面是我有的代码:app.get('/search', function (req, res) { app.readFile('data.json', 'utf8', function (err, data) { if (err) throw err; obj = JSON.parse(/data.json/); res.send(JSON.stringify(obj)); }); });当我在本地主机上运行时,我会收到一个错误,指出app.readFile不是一个函数。有任何线索为什么会这样吗? - Theo Strauss
app.readFile不起作用。您首先必须添加一个require语句。var fs = require('fs'); 然后使用 fs.readFile - Arpit Solanki
嗯,fs是什么?应该是'app'吗? - Theo Strauss
fs(文件系统)是Node中包含的一个模块。 - user5480949

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接