如何在页面加载前使用 NODE 更改一些 HTML?
How to use NODE to change some HTML before page load?
您好,我一直在尝试使用 NODE 更改我的一些 HTML 元素。
所以我使用 Node 模块 request
和 cheerio
在页面加载之前获取特定的 html 元素。
我想要实现的是从我的数据库中获取一些数据并在加载之前修改 html。这是我拥有的:
app.js:
router.get('/goToSettings', (req, res) => {
//get session id
const id = 1;
//prepare SQL query
const sqlQuery = "SELECT first_name, last_name, username, email FROM myTable WHERE id = ?";
//Get data from DB by using the id retrieved from SESSION
getConnection().query(sqlQuery, [id], async (err, results, fields) => {
//Catch error with MySQL connection
if(err){
console.log(" > The connection have failed :( >" + err);
res.sendStatus(500);
}
var url = "http://host.com/settings.html";
request(url, async function(error, response, html){
if(!error){
var $ = cheerio.load(html);
//DEFAULT VALUES FROM HTML:
//a.value = Johnny
//b.value = Blue
//c.value = j.b@email.com
//Set new values from my DB
var a = $('input.settings_1').val(results[0].first_name);
var b = $('input.settings_2').val(results[0].last_name);
var c = $('input.settings_3').val(results[0].email);
console.log(a.val()); //myNewFirstName
console.log(b.val()); //myNewLastName
console.log(c.val()); //myNewEmail
await res.redirect('/accountSettings.html'); //VALUES of a,b,c remain (Johnny, Blue, j.b@email.com)
}else{
console.log("WRONG URL");
}
});
});
});
console.log
上的数据似乎已更改,一切看起来都很好,但是当页面被重定向时,一切都恢复为默认值。我尝试在更改之前加载页面,但没有成功。这就是我发现我必须使用 await/async
以便进行更改然后调用 redirect
的地方,但同样没有任何变化。重定向是否会在加载时重置 html 文件?
有人建议使用 AJAX 来执行此任务,但我以前没有这方面的经验。我想如果这是不可能的,我会尝试使用它。也有人向我建议,这不应该是这种方式(节点不应该处理这个),如果你同意,请告诉我。
解决方案:
//cmd
npm i ejs
//app.js
app.set('view engine', 'ejs');
//Save Data in list of objects
let objects = [
{ value: results[0].first_name },
{ value: results[0].last_name },
{ value: results[0].email }
];
//REDIRECT PAGE WITH SOME DATA
res.render('accountSettings', {object: objects})
//REMEMBER TO CHANGE HTML TO .ejs EXTENSION.
//MOVE settings.ejs TO DIR:
//yourAppDir > views > settings.js
//settings.ejs
<input value="<%= object[0].value %>">
<input value="<%= object[1].value %>">
<input value="<%= object[2].value %>">
您的方法不起作用的核心原因是您正在从 settings.html 的内容创建一个 DOM,对其进行操作,但从未将其保存回文件。
但是,该方法本身存在严重缺陷。它效率低下并且受竞争条件的影响。你需要改变你的方法。
- 摆脱 cheerio
- 将 HTML 文档转换为 template. There are plenty to choose from。
- 用将您的数据传递到模板中的渲染调用替换重定向:
这样的:
res.render('accountSettings.ejs', { settings: results[0] });
您好,我一直在尝试使用 NODE 更改我的一些 HTML 元素。
所以我使用 Node 模块 request
和 cheerio
在页面加载之前获取特定的 html 元素。
我想要实现的是从我的数据库中获取一些数据并在加载之前修改 html。这是我拥有的:
app.js:
router.get('/goToSettings', (req, res) => {
//get session id
const id = 1;
//prepare SQL query
const sqlQuery = "SELECT first_name, last_name, username, email FROM myTable WHERE id = ?";
//Get data from DB by using the id retrieved from SESSION
getConnection().query(sqlQuery, [id], async (err, results, fields) => {
//Catch error with MySQL connection
if(err){
console.log(" > The connection have failed :( >" + err);
res.sendStatus(500);
}
var url = "http://host.com/settings.html";
request(url, async function(error, response, html){
if(!error){
var $ = cheerio.load(html);
//DEFAULT VALUES FROM HTML:
//a.value = Johnny
//b.value = Blue
//c.value = j.b@email.com
//Set new values from my DB
var a = $('input.settings_1').val(results[0].first_name);
var b = $('input.settings_2').val(results[0].last_name);
var c = $('input.settings_3').val(results[0].email);
console.log(a.val()); //myNewFirstName
console.log(b.val()); //myNewLastName
console.log(c.val()); //myNewEmail
await res.redirect('/accountSettings.html'); //VALUES of a,b,c remain (Johnny, Blue, j.b@email.com)
}else{
console.log("WRONG URL");
}
});
});
});
console.log
上的数据似乎已更改,一切看起来都很好,但是当页面被重定向时,一切都恢复为默认值。我尝试在更改之前加载页面,但没有成功。这就是我发现我必须使用 await/async
以便进行更改然后调用 redirect
的地方,但同样没有任何变化。重定向是否会在加载时重置 html 文件?
有人建议使用 AJAX 来执行此任务,但我以前没有这方面的经验。我想如果这是不可能的,我会尝试使用它。也有人向我建议,这不应该是这种方式(节点不应该处理这个),如果你同意,请告诉我。
解决方案:
//cmd
npm i ejs
//app.js
app.set('view engine', 'ejs');
//Save Data in list of objects
let objects = [
{ value: results[0].first_name },
{ value: results[0].last_name },
{ value: results[0].email }
];
//REDIRECT PAGE WITH SOME DATA
res.render('accountSettings', {object: objects})
//REMEMBER TO CHANGE HTML TO .ejs EXTENSION.
//MOVE settings.ejs TO DIR:
//yourAppDir > views > settings.js
//settings.ejs
<input value="<%= object[0].value %>">
<input value="<%= object[1].value %>">
<input value="<%= object[2].value %>">
您的方法不起作用的核心原因是您正在从 settings.html 的内容创建一个 DOM,对其进行操作,但从未将其保存回文件。
但是,该方法本身存在严重缺陷。它效率低下并且受竞争条件的影响。你需要改变你的方法。
- 摆脱 cheerio
- 将 HTML 文档转换为 template. There are plenty to choose from。
- 用将您的数据传递到模板中的渲染调用替换重定向:
这样的:
res.render('accountSettings.ejs', { settings: results[0] });