如何使用 JavaScript 正确编码服务器端和客户端之间的交换数据?
How to correctly code an interchange data between server-side and client-side using JavaScript?
我在 Web 应用程序上工作,需要将 editable tables 合并到 HTML 页面中。找到了很棒的 JS 工具“Tabulator”,然而,我缺乏在服务器与客户端之间来回传输数据方面的基本知识。好了,进入正题。
在服务器端:
- Node.js 文件,比方说
app.js
- 所需数据存储在 Mongo 数据库中的两个集合中,用户和资源
在客户端:
- HTML 文件
stat.html
嵌入两个 Tabulator 的 table
- JS文件
table.js
===阶段1.从服务器向客户端发送数据===
第 1 步。app.js
从 Mongo 数据库中提取数据并将其发送到 table.js
//=== render stat.html page ===//
router.get('/stat', (req,res)=>{
res.render('stat');
});
//=== pull user data from mongo and send it to table.js ===//
router.get('/stat', (req,res) => {
User.find({}, (err, users) => {
if (err) throw err;
res.send(users);
});
});
//=== pull resource data from mongoand send it to table.js ===//
router.get('/stat', (req,res) => {
Resource.find({}, (err, resources) => {
if (err) throw err;
res.send(resources);
});
});
这里我有几个问题:
- 问题 #1。我做对了吗?
- 问题 #2。是否可以在一个路由中渲染页面并向客户端 JS 发送数据?我试过了,但出现错误。
- 问题#3。 mongoose
Collection.find
的输出采用 JSON 格式,这正是 Tabulator 所需要的。在将它发送到客户端之前,我是否需要以任何方式对其进行操作?例如使用 JSON.stringify
- 问题 #4。有什么方法可以检查数据是否真的在发送?
- 问题 #5。我需要为不同的 table 发送两个不同的 JSON。如果它们通过一条路线发送,如何在客户端将一条路线与另一条路线分开?我正在考虑使用不同的路径,例如
/stat/user
和 /stat/resource
但是如何触发它们?
第 2 步。在客户端 table.js
文件接收数据并将其提供给 Tabulator tables。 Tabulator 有自己的选项来请求远程数据 ajaxURL
//setup user table
var table = new Tabulator('#user-table',{
ajaxURL:"stat/user",
});
//setup resource table
var table = new Tabulator('#resource-table',{
ajaxURL:"stat/resource",
});
问题:
- 问题#6。由于页面上有两个 table,我需要使用两个不同的 URL。这又回到了问题#5。如何在渲染页面时触发这些路径
- 问题#7。假设没有
ajaxURL
如何读取 table.js
中的数据?我试过 Fetch API 但没有成功。
table.js
中的获取请求
fetch('/stat/user', {
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(users)
})
.then(response => response.json())
.then(function(response) {
if (response.ok) {
console.log('got data: ', response.users);
}
throw new Error('Request failed.');
})
.catch(function(error) {
console.log(error);
});
第 2 阶段旨在将数据从客户端发送回服务器。但我认为这已经是压倒性的了,也许这部分最好暂时搁置。
我知道互联网上有很多文章,Whosebug 中有关于这个主题的问题,并且阅读了很多但仍然没有掌握,所以请不要推荐 MDN 手册之类的东西。
我将非常感谢任何帮助。
自己整理的。特别感谢@jonrsharpe。
如果有人需要这方面的帮助,我很乐意提供帮助。
我在 Web 应用程序上工作,需要将 editable tables 合并到 HTML 页面中。找到了很棒的 JS 工具“Tabulator”,然而,我缺乏在服务器与客户端之间来回传输数据方面的基本知识。好了,进入正题。
在服务器端:
- Node.js 文件,比方说
app.js
- 所需数据存储在 Mongo 数据库中的两个集合中,用户和资源
在客户端:
- HTML 文件
stat.html
嵌入两个 Tabulator 的 table - JS文件
table.js
===阶段1.从服务器向客户端发送数据===
第 1 步。app.js
从 Mongo 数据库中提取数据并将其发送到 table.js
//=== render stat.html page ===//
router.get('/stat', (req,res)=>{
res.render('stat');
});
//=== pull user data from mongo and send it to table.js ===//
router.get('/stat', (req,res) => {
User.find({}, (err, users) => {
if (err) throw err;
res.send(users);
});
});
//=== pull resource data from mongoand send it to table.js ===//
router.get('/stat', (req,res) => {
Resource.find({}, (err, resources) => {
if (err) throw err;
res.send(resources);
});
});
这里我有几个问题:
- 问题 #1。我做对了吗?
- 问题 #2。是否可以在一个路由中渲染页面并向客户端 JS 发送数据?我试过了,但出现错误。
- 问题#3。 mongoose
Collection.find
的输出采用 JSON 格式,这正是 Tabulator 所需要的。在将它发送到客户端之前,我是否需要以任何方式对其进行操作?例如使用JSON.stringify
- 问题 #4。有什么方法可以检查数据是否真的在发送?
- 问题 #5。我需要为不同的 table 发送两个不同的 JSON。如果它们通过一条路线发送,如何在客户端将一条路线与另一条路线分开?我正在考虑使用不同的路径,例如
/stat/user
和/stat/resource
但是如何触发它们?
第 2 步。在客户端 table.js
文件接收数据并将其提供给 Tabulator tables。 Tabulator 有自己的选项来请求远程数据 ajaxURL
//setup user table
var table = new Tabulator('#user-table',{
ajaxURL:"stat/user",
});
//setup resource table
var table = new Tabulator('#resource-table',{
ajaxURL:"stat/resource",
});
问题:
- 问题#6。由于页面上有两个 table,我需要使用两个不同的 URL。这又回到了问题#5。如何在渲染页面时触发这些路径
- 问题#7。假设没有
ajaxURL
如何读取table.js
中的数据?我试过 Fetch API 但没有成功。
table.js
fetch('/stat/user', {
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(users)
})
.then(response => response.json())
.then(function(response) {
if (response.ok) {
console.log('got data: ', response.users);
}
throw new Error('Request failed.');
})
.catch(function(error) {
console.log(error);
});
第 2 阶段旨在将数据从客户端发送回服务器。但我认为这已经是压倒性的了,也许这部分最好暂时搁置。
我知道互联网上有很多文章,Whosebug 中有关于这个主题的问题,并且阅读了很多但仍然没有掌握,所以请不要推荐 MDN 手册之类的东西。
我将非常感谢任何帮助。
自己整理的。特别感谢@jonrsharpe。
如果有人需要这方面的帮助,我很乐意提供帮助。