Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我无法通过fetch API从客户端的服务器(node.js+;express)获取数据_Javascript_Node.js - Fatal编程技术网

Javascript 我无法通过fetch API从客户端的服务器(node.js+;express)获取数据

Javascript 我无法通过fetch API从客户端的服务器(node.js+;express)获取数据,javascript,node.js,Javascript,Node.js,如何使用服务器的res.render()或res.json()方法中的fetch()在客户端上获取{data:data} 1) 呈现页面 2) 调用fetch(),数据(data)来自服务器 3) 我想在DOM 数据来了,但他们重新绘制了页面,我看到了json结构 Server.js let PORT = process.env.PORT || 5000; const express = require('express'); const app = express(); const serve

如何使用服务器的
res.render()
res.json()
方法中的
fetch()
在客户端上获取
{data:data}

1) 呈现页面

2) 调用
fetch()
,数据(data)来自服务器

3) 我想在
DOM

数据来了,但他们重新绘制了页面,我看到了
json
结构

Server.js

let PORT = process.env.PORT || 5000;
const express = require('express');
const app = express();
const server = require('http').createServer(app);

// not matter
app.set('views', './views');
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.use(express.json());

// this
const data = { 
  array: [1, 2, 3], 
  string: 'string' 
};
app.get('/', function(req, res) {
  res.json(data)
});

ejs(html)


文件
获取(“/”)
。然后(res=>{
返回res.json();
})
.then(obj=>console.log(obj));

执行此操作时:

fetch("/", {method: "get"}).then(res => {
    console.log(res);
});
您会发现
res
是一个主体对象,它包含一个可读流,而该流中的数据尚未读取(仅读取了标题)。因此,要获取该数据,必须根据所需的数据类型使用读取该数据的方法

res.json()
res.text()
res.formData()
res.blob();
res.arrayBuffer();
这些都是异步方法,它们也返回一个承诺。因此,如果您只需要文本:

fetch("/", {method: "get"}).then(res => res.text()).then(text => {
    console.log(text);
});

我的代码工作正常

问题是我正在从我所在的位置获取数据

示例:我在本页-
localhost:5000/
,试图从同一位置获取数据:

app.get(/, function (req, res ) {
   res.json(data);
})
结果是,首先我从服务器获取数据,然后
res.json(data)
方法发送数据并在页面上绘制这些数据,仅此而已

如果我需要什么,我会开处方:

app.get(/data, function (req, res ) {
   res.json(data);
});
完整代码:
我们启动服务器,转到
localhost/
,打开控制台,然后bam

非常感谢您对客户机-服务器数据传输工作原理的详细解释@JFriend00为什么
socket.io
不需要这些方法?当我们调用
emit
,或
soocket.io('event',…)
?@MichaelPodlevskykh-http是一种流协议时,它们已经做到了。http请求的主体可以是任何内容。它可能是20个视频的集合,甚至不能一次全部读入内存。socket.io是一种基于消息的协议。它将事物定义为消息,协议库读取整个消息并将其呈现给您。它们只是不同的协议,为不同的事情设计,工作方式不同。最后一个问题。如何在res.render(客户端的第二个参数)中获取这些数据,并使用它们的参数<代码>应用程序获取('/',函数(req,res){res.render('index',{data:data});
})
我认为它必须是json()@MichaelPodlevskykh-而不是设计用来呈现HTML模板的
res.render()
,使用
res.json({data:data})
然后使用
fetch(“/”)。然后(res=>res.json())。然后(obj=>{console.log(obj);})
app.get(/data, function (req, res ) {
   res.json(data);
});
app.get('/', function(req, res) {
  res.send('index');
});

const data = { 
  array: [1, 2, 3], 
  string: 'string' 
};

app.get('/data', function(req, res) { // <---
  res.json(data);
});
fetch('/data').then(res => res.json())
  .then(obj => console.log(obj));