Javascript 如何编写正确的app.get()?(node.js/express/boby解析器)

Javascript 如何编写正确的app.get()?(node.js/express/boby解析器),javascript,node.js,express,body-parser,Javascript,Node.js,Express,Body Parser,我创建服务器(node.js/express/boby解析器) 我需要得到一组对象“用户”。 它是server.js文件中代码的一部分: let users = [{ name: 'user1', }]; app.get('/users/', (req, res) => { const filePath = path.join(pth.dir, 'build', 'index.html'); res.json(users); res.sendFile(fi

我创建服务器(node.js/express/boby解析器)

我需要得到一组对象“用户”。 它是server.js文件中代码的一部分:

let users = [{
    name: 'user1',
}];

app.get('/users/', (req, res) => {
    const filePath = path.join(pth.dir, 'build', 'index.html');
    res.json(users);
    res.sendFile(filePath);
});
这是前端的“我的代码”:

const handleResponse = (response) => {
    return response.text().then(text => {
        const data = text && JSON.parse(text);
        if (!response.ok) {
            const error = (data && data.message) || response.statusText;
            return Promise.reject(error);
        }
        return data;
    });
};

const getAll = (baseUrl) =>  {
    const requestOptions = {
        method: 'GET'
    };
    return fetch(baseUrl, requestOptions).then(handleResponse);
};
服务器上的代码有问题。(我只是不知道如何使用express server)。 当我使用getAll函数时,我得到了JSON文本来替换我的页面。有人能帮忙吗?如何在server.js中编写app.get()。或者我需要在服务器第一部分中写入app.get()来获取页面,还是需要另一个app.get()来获取JSON数据?

res.JSON()表示Express应用程序在收到HTTP请求时发送的HTTP响应。另一方面,
res.sendFile()

在这两种情况下,流基本上被传输到可能发出请求的客户机

因此,不能同时使用
res.sendFile
res.json

var options = {
    headers: {
        'name': 'user1',
    }
  };

res.sendFile(path.join(__dirname, 'build', 'index.html'), options);


这确实是您为完成所需任务所能做的最接近的事情。

您为什么要尝试在响应中发送文件

res.sendFile(filePath);
首先,响应内容可以是JSON或文件(当然也可以是其他任何内容),但不能同时是JSON或文件。对于JSON或XML之类的数据,可以将多个对象组合成一个更大的对象,以获得单个响应,但如果内容类型与文件完全不同,则这将不起作用

查看客户端代码,您甚至没有对该文件做任何操作。您只读取JSON数据:

return response.text().then(text => {
    const data = text && JSON.parse(text);
    if (!response.ok) {
        const error = (data && data.message) || response.statusText;
        return Promise.reject(error);
    }
    return data;
});
因此,这里最简单的方法就是不要尝试发回文件:

app.get('/users/', (req, res) => {
    res.json(users);
});
编辑:根据下面的评论,您似乎正在努力处理客户端向服务器发出的不同请求。浏览器加载页面是一个请求加一个响应。如果该页面包含需要获取数据的JavaScript,那么这将是一个单独的AJAX请求,它自己的响应只包含该数据


可以使用JSON(或任何数据)服务器端填充页面模板并返回包含数据的整个页面。为此,在返回页面之前,您需要在服务器端代码中使用(或构建)某种模板引擎来填充页面。

您正在尝试发送两种不同的响应。一个是JSON数据,另一个是文件。您只能发送一个响应。您想发送哪一个?因此,要从地址“/users/”获取页面和从地址“/users/”获取JSON,我需要编写两个不同的app.get()?如果您想提供两个完全不同的响应,那么客户端必须发出两个不同的请求才能获取这些响应。通常可以将数据(如JSON或XML)组合到一个更大的响应对象中,但同时使用JSON和文件进行响应是行不通的,因为内容类型完全不同。浏览器或任何标准客户端都不知道如何处理这种混合。谢谢。但是如何获得JSON呢?我需要创建另一个地址,可能是“/users/data/”?你可以从标题中获取用户名。像这样的自定义标题会很奇怪。它可以工作,但如果
users
对象的结构增长,它会很快崩溃。(事实上,
users
是一个对象数组,而不仅仅是一个字符串值意味着这种可能性。)看看问题中的客户端代码,我很好奇为什么响应中需要包含一个文件?代码似乎只是在读取JSON数据。谢谢。但是当我把app.get()改成这个-
app.get('/users/',(req,res)=>{res.json(users);})我只得到了带有JSON文本的空白页面,而不是我的用户页面。我使用“react router dom”并使用此路径显示用户页面<代码>
那么我需要创建路径来获取Json数据吗<例如code>/usersData/
。@WillBlack:这里的目标是什么?您正在尝试返回JSON数据吗?档案?网页?在客户端代码中,您只读取JSON数据,所以您甚至试图在哪里打开文件或网页?我得到了page,/users/我需要得到Joson数据来向用户显示这个页面page@WillBlack:“我需要获取JSON数据”-那么有什么问题?在前面的评论中,您指出它正在成功返回JSON数据,这是您想要的(也是客户端代码所期望的)。Willback:“也许我需要两个函数”——如果你想返回两个完全不同的回答,可以。客户端会发出两个请求来获取这些响应。