Node.js 在HTML中呈现节点API数据
我一直在学习本教程: 我的HTML页面中有以下脚本:Node.js 在HTML中呈现节点API数据,node.js,Node.js,我一直在学习本教程: 我的HTML页面中有以下脚本: ... <script> fetch('http://ec2-22-222-22-22.compute-1.amazonaws.com:8080/fish') .then(function (response) { return response.json(); }) .then(function (data) { append
...
<script>
fetch('http://ec2-22-222-22-22.compute-1.amazonaws.com:8080/fish')
.then(function (response) {
return response.json();
})
.then(function (data) {
appendData(data);
})
.catch(function (err) {
console.log('error: ' + err);
});
function appendData(data) {
var mainContainer = document.getElementById("myData");
for (var i = 0; i < data.length; i++) {
var div = document.createElement("div");
div.textContent = '>> ' + data[i].timestamp + ' ' + data[i].date + ' ' + data[i].time + ' ' + data[i].airt_c + ' ' + data[i].rh + ' ' + data[i].dewp + ' ' + data[i].prec + ' ' + data[i].slrr + ' ' + data[i].parr + ' ' + data[i].netr + ' ' + data[i].bar + ' ' + data[i].wspd + ' ' + data[i].wdir + ' ' + data[i].gspd + ' ' + data[i].s10t;
mainContainer.appendChild(div);
}
}
</script>
</head>
<body>
<div class="bg">
<div id="myData"></div>
</div>
我的index.js
文件(运行在ec2上——与HTML页面不同的主机上)如下所示:
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const port = 8080
const db = require('./queries')
app.use(bodyParser.json())
app.use(
bodyParser.urlencoded({
extended: true,
})
)
app.get('/', (request, response) => {
response.json({ info: 'Node.js, Express, and Postgres API' })
})
app.listen(port, () => {
console.log(`App running on port ${port}.`)
})
app.get('/fish', db.getFish)
const Pool = require('pg').Pool
const pool = new Pool({
user: 'user',
host: 'database-1.sdsad2233.rds.amazonaws.com',
database: 'db',
password: 'pass',
})
const getFish = (request, response) => {
pool.query('SELECT * FROM table ORDER BY timestamp DESC LIMIT 10', (error, results) => {
if (error) {
throw error
}
response.status(200).json(results.rows)
})
}
module.exports = {
getFish,
}
我的querys.js
如下所示:
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const port = 8080
const db = require('./queries')
app.use(bodyParser.json())
app.use(
bodyParser.urlencoded({
extended: true,
})
)
app.get('/', (request, response) => {
response.json({ info: 'Node.js, Express, and Postgres API' })
})
app.listen(port, () => {
console.log(`App running on port ${port}.`)
})
app.get('/fish', db.getFish)
const Pool = require('pg').Pool
const pool = new Pool({
user: 'user',
host: 'database-1.sdsad2233.rds.amazonaws.com',
database: 'db',
password: 'pass',
})
const getFish = (request, response) => {
pool.query('SELECT * FROM table ORDER BY timestamp DESC LIMIT 10', (error, results) => {
if (error) {
throw error
}
response.status(200).json(results.rows)
})
}
module.exports = {
getFish,
}
如何在HTML页面中显示该查询的结果
--
编辑
有人提到这个问题可能是因为HTML页面位于不同的主机上,并且没有HTTPS
我试图在同一台ec2服务器上的一个单独的.js文件中创建HTML,但遇到了一个错误
我的代码:
var http=require("http");
var server = http.createServer(function(request, response) {});
var server = http.createServer(function(request, response) {
response.writeHead(200, {
'Content-Type': 'text/plain'
});
});
var server = http.createServer(function(request, response) {
response.writeHead(200, {
'Content-Type': 'text/plain'
});
response.write("This is Test Message.");
response.end();
});
server.listen(8082);
fetch('/fish')
.then(function (response) {
return response.json();
})
.then(function (data) {
appendData(data);
})
.catch(function (err) {
console.log('error: ' + err);
});
function appendData(data) {
var mainContainer = document.getElementById("myData");
for (var i = 0; i < data.length; i++) {
var div = document.createElement("div");
div.textContent = '>> ' + data[i].timestamp + ' ' + data[i].date + ' ' + data[i].time + ' ' + data[i].airt_c + ' ' + data[i].rh + ' ' + data[i].dewp + ' ' + data[i].prec + ' ' + data[i].slrr + ' ' + data[i].parr + ' ' + data[i].netr + ' ' + data[i].bar + ' ' + data[i].wspd + ' ' + data[i].wdir + ' ' + data[i].gspd + ' ' + data[i].s10t;
mainContainer.appendChild(div);
}
}
var http=require(“http”);
var server=http.createServer(函数(请求、响应){});
var server=http.createServer(函数(请求、响应){
书面答复(200{
“内容类型”:“文本/普通”
});
});
var server=http.createServer(函数(请求、响应){
书面答复(200{
“内容类型”:“文本/普通”
});
写(“这是测试消息”);
response.end();
});
监听服务器(8082);
获取(“/fish”)
.然后(功能(响应){
返回response.json();
})
.then(功能(数据){
附加数据(数据);
})
.catch(函数(err){
log('error:'+err);
});
函数追加数据(数据){
var mainContainer=document.getElementById(“myData”);
对于(变量i=0;i
错误:
$ node reality.js
/home/ubuntu/riapi/webpage.js:19
fetch('/fish')
^
ReferenceError: fetch is not defined
at Object.<anonymous> (/home/ubuntu/riapi/webpage.js:19:1)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3
$node reality.js
/home/ubuntu/riapi/webpage.js:19
获取(“/fish”)
^
ReferenceError:未定义提取
反对。(/home/ubuntu/riapi/webpage.js:19:1)
编译(Module.js:652:30)
在Object.Module.\u extensions..js(Module.js:663:10)
在Module.load(Module.js:565:32)
在tryModuleLoad时(module.js:505:12)
在Function.Module.\u加载(Module.js:497:3)
位于Function.Module.runMain(Module.js:693:10)
启动时(bootstrap_node.js:188:16)
在bootstrap_node.js:609:3
我认为您有两个问题:
fetch
和
DOM API仅在浏览器中可用,而不在NodeJ中可用,因此
您正试图访问获取的第一个错误fetch是
未定义
const cors=require('cors'))
app.use(cors())
因此,最终的服务器端代码应该如下所示
const express=require('express'))
const bodyParser=require('body-parser')
const cors=require('cors')//首先需要'npm安装cors'
const app=express()
常数端口=8080
const db=require(“./querys”)
app.use(cors())//启用cors请求
app.use(bodyParser.json())
应用程序使用(
bodyParser.urlencoded({
是的,
})
)
app.get(“/”,(请求、响应)=>{
json({info:'Node.js、Express和Postgres-API'})
})
应用程序侦听(端口,()=>{
log(`App running on port${port}.`)
})
app.get('/fish',db.getFish)
当你使用或curl之类的东西向你的API发出请求时会发生什么?@HowlingFantods-当我从终端curl
时,我正确地取回了记录。Chrome的开发工具在这种情况下非常有用。打开控制台(Command+Option+J(Mac)或Control+Shift+J(Windows、Linux、Chrome OS)),查看是否有任何错误。如果没有,请尝试在代码中添加一个“断点”(在新行上,添加debugger;
),这将允许您在代码中的给定点检查不同变量的值。我将从appendData
函数内部开始。@HowlingFantods-我发现了这个,我正在尝试解码:访问以获取http://ec2-22-222-22-22.compute-1.amazonaws.com:8080/fishCORS策略已阻止来自源“null”:请求的资源上不存在“访问控制允许源”标头。如果不透明响应满足您的需要,请将请求的模式设置为“无cors”,以获取禁用cors的资源。