为什么 fetch 方法不能获取任何东西?(feat node.js, restAPI)
Why fetch method can't fetch anything?(feat node.js, restAPI)
我是 node.js 和 mySQL 的新手
我做克隆编码餐厅网站。
所以我做了数据库和服务器。
var app=express();
app.listen(9999,function(){ //I'm using 9999 port and I use Localhost
console.log('Server is running');
})
//connect mySQL
var client=mysql.createConnection({
user:'root',
password:'pswd' //for Question
});
我使用 9999 端口并在本地主机上打开我的服务器。
我有 html。只是测试 html 文件(minuk_test.html)
当我请求“/store/restaurant_info”时,我想使用 json.
接收数据
--main.js--
app.get('/store/restaurant_info',function(request,response){
client.query('SELECT * FROM RESTAURANT_INFO',function(error,result,fields){
if(error){
console.log('Query syntax error');
}else{
response.json(result);
console.dir(result[0].name);
console.log('check sending data');
}
});
});
app.get('/Project/html/minuk_test.html',function(request,response){
fs.readFile('../html/minuk_test.html','utf-8',function(error,data){
if(error){
console.log('Loading minuk_test.html is failed');
}
response.send(data);
})
})
这是我的 html 代码。
-- html 文件--
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API TEST</title>
<link rel="stylesheet" href="/minuks_test.js">
</head>
<body>
<h1>Test</h1>
<div id="restaurant">
<span></span>
<span></span>
</div>
</body>
</html>
这是我的 javascript
--javscript文件--
import fetch from "node-fetch";
function getAPI(){
const url=`http://127.0.0.1:9999/store/restaurant_info`;
fetch(url)
.then(response=>{
console.log(response);
response.json();
})
.then(data={
console.log(data);
});
}
getAPI();
我希望当我输入“minuk_test.html”时,html 执行javascript 文件。
在 javascript 文件中,使用 get 请求 url 购买。
但是我有两个问题。
首先,我 运行 我的服务器。并输入 localhost:9999/Project/html/minuk_test.html
如果 html 运行 javascript 文件。 javascript 向 /store/restaurant_info 提交请求。
然后服务器控制台打印 result[0].name 和 'check sending data' 但控制台很清楚。
其次,我运行 javascript文件打开了服务器。
然后console.log(响应)在这里
Response {
size: 0,
[Symbol(Body internals)]: {
body: PassThrough {
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 5,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: true,
[Symbol(kCapture)]: false,
[Symbol(kCallback)]: null
},
stream: PassThrough {
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 5,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: true,
[Symbol(kCapture)]: false,
[Symbol(kCallback)]: null
},
boundary: null,
disturbed: false,
error: null
},
type: 'default',
url: 'http://127.0.0.1:9999/store/restaurant_info',
status: 200,
statusText: 'OK',
headers: {
connection: 'close',
'content-length': '8035',
'content-type': 'application/json; charset=utf-8',
date: 'Mon, 30 May 2022 11:53:15 GMT',
etag: 'W/"1f63-IYBGYq/MlY5TBn49Gp7cFQ7aH+A"',
'x-powered-by': 'Express'
},
counter: 0,
highWaterMark: 16384
}
}
undefined //console.log(data);
response.size为0,正常吗?
console.log(data) 未定义
但在邮递员中,
postman 可以接收 json 数据。
我不明白为什么我的 html 收不到 json。
请帮助我。
因为 html 文件中没有包含 javascript 文件,而且它不包含是因为您没有在网络服务器上提供静态文件,所以没有任何东西运行(另外,它不是 stylesheet
,但 script
标签)
如果您内联 javascript,它应该可以工作。此外,在浏览器中您使用 fetch
,并在 server-side 上使用 node-fetch
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API TEST</title>
<script>
function getAPI(){
const url=`http://127.0.0.1:9999/store/restaurant_info`;
fetch(url)
.then(response=>{
console.log(response);
response.json();
})
.then(data={
console.log(data);
});
}
getAPI();
</script>
</head>
<body>
<h1>Test</h1>
<div id="restaurant">
<span></span>
<span></span>
</div>
</body>
</html>
但您应该设置静态文件,请参见此处:
https://expressjs.com/en/starter/static-files.html
此外,您可以设置自己的路由,无需扩展名,也可以使用 .sendFile
代替 fs
来提供特定文件,但您需要提供绝对路径(通过 path
模块):
看这里:
http://expressjs.com/en/api.html#res.sendFile
app.get('/my-route', function(request, response, next) {
response.sendFile(require('path').join(__dirname, '../html/minuk_test.html'), function(err) {
if (err) {
next(err)
} else {
console.log('Sent:', fileName)
}
});
});
我是 node.js 和 mySQL 的新手 我做克隆编码餐厅网站。 所以我做了数据库和服务器。
var app=express();
app.listen(9999,function(){ //I'm using 9999 port and I use Localhost
console.log('Server is running');
})
//connect mySQL
var client=mysql.createConnection({
user:'root',
password:'pswd' //for Question
});
我使用 9999 端口并在本地主机上打开我的服务器。
我有 html。只是测试 html 文件(minuk_test.html) 当我请求“/store/restaurant_info”时,我想使用 json.
接收数据--main.js--
app.get('/store/restaurant_info',function(request,response){
client.query('SELECT * FROM RESTAURANT_INFO',function(error,result,fields){
if(error){
console.log('Query syntax error');
}else{
response.json(result);
console.dir(result[0].name);
console.log('check sending data');
}
});
});
app.get('/Project/html/minuk_test.html',function(request,response){
fs.readFile('../html/minuk_test.html','utf-8',function(error,data){
if(error){
console.log('Loading minuk_test.html is failed');
}
response.send(data);
})
})
这是我的 html 代码。 -- html 文件--
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API TEST</title>
<link rel="stylesheet" href="/minuks_test.js">
</head>
<body>
<h1>Test</h1>
<div id="restaurant">
<span></span>
<span></span>
</div>
</body>
</html>
这是我的 javascript
--javscript文件--
import fetch from "node-fetch";
function getAPI(){
const url=`http://127.0.0.1:9999/store/restaurant_info`;
fetch(url)
.then(response=>{
console.log(response);
response.json();
})
.then(data={
console.log(data);
});
}
getAPI();
我希望当我输入“minuk_test.html”时,html 执行javascript 文件。 在 javascript 文件中,使用 get 请求 url 购买。
但是我有两个问题。
首先,我 运行 我的服务器。并输入 localhost:9999/Project/html/minuk_test.html 如果 html 运行 javascript 文件。 javascript 向 /store/restaurant_info 提交请求。 然后服务器控制台打印 result[0].name 和 'check sending data' 但控制台很清楚。
其次,我运行 javascript文件打开了服务器。 然后console.log(响应)在这里
Response {
size: 0,
[Symbol(Body internals)]: {
body: PassThrough {
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 5,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: true,
[Symbol(kCapture)]: false,
[Symbol(kCallback)]: null
},
stream: PassThrough {
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 5,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: true,
[Symbol(kCapture)]: false,
[Symbol(kCallback)]: null
},
boundary: null,
disturbed: false,
error: null
},
type: 'default',
url: 'http://127.0.0.1:9999/store/restaurant_info',
status: 200,
statusText: 'OK',
headers: {
connection: 'close',
'content-length': '8035',
'content-type': 'application/json; charset=utf-8',
date: 'Mon, 30 May 2022 11:53:15 GMT',
etag: 'W/"1f63-IYBGYq/MlY5TBn49Gp7cFQ7aH+A"',
'x-powered-by': 'Express'
},
counter: 0,
highWaterMark: 16384
}
}
undefined //console.log(data);
response.size为0,正常吗? console.log(data) 未定义
但在邮递员中,
postman 可以接收 json 数据。
我不明白为什么我的 html 收不到 json。 请帮助我。
因为 html 文件中没有包含 javascript 文件,而且它不包含是因为您没有在网络服务器上提供静态文件,所以没有任何东西运行(另外,它不是 stylesheet
,但 script
标签)
如果您内联 javascript,它应该可以工作。此外,在浏览器中您使用 fetch
,并在 server-side 上使用 node-fetch
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API TEST</title>
<script>
function getAPI(){
const url=`http://127.0.0.1:9999/store/restaurant_info`;
fetch(url)
.then(response=>{
console.log(response);
response.json();
})
.then(data={
console.log(data);
});
}
getAPI();
</script>
</head>
<body>
<h1>Test</h1>
<div id="restaurant">
<span></span>
<span></span>
</div>
</body>
</html>
但您应该设置静态文件,请参见此处:
https://expressjs.com/en/starter/static-files.html
此外,您可以设置自己的路由,无需扩展名,也可以使用 .sendFile
代替 fs
来提供特定文件,但您需要提供绝对路径(通过 path
模块):
看这里:
http://expressjs.com/en/api.html#res.sendFile
app.get('/my-route', function(request, response, next) {
response.sendFile(require('path').join(__dirname, '../html/minuk_test.html'), function(err) {
if (err) {
next(err)
} else {
console.log('Sent:', fileName)
}
});
});