单击删除按钮后尝试从节点后端渲染我的 ejs 文件 - 不使用 ajax

问题描述 投票:0回答:1

我有一个简单的博客应用程序,使用 Node.js 作为后端,使用 ejs 作为前端。我能够使用带有输入类型提交的网络表单来发布博客,调用发布路由。这很好用。但现在我正在尝试为每个帖子实现一个删除按钮。我发现让按钮(在表单之外)与节点一起使用的唯一方法是使用 ajax 和 fetch,如下所示:

这会注册按钮单击并触发删除功能,但会产生当我尝试发送响应时页面无法呈现的问题: res.render(path.resolve("views/index.ejs"), data);这显然就是ajax 的工作原理。 我发现可以在不使用ajax的情况下做到这一点,使用带有节点的jquery,这也是可能的,但不是直接的,而且我不知道如何做。

我是node和ejs的绝对初学者,所以非常欢迎任何帮助! (P.S:我尝试在这个问题中包含我的代码,但页面坚持告诉我它的格式不正确并且不允许我..)

按下删除按钮会触发 /delete 路由和删除功能,但不会渲染页面。

javascript node.js ejs
1个回答
0
投票
我真的不知道你的意思

我发现可以在不使用ajax的情况下做到这一点,使用带有节点的jquery...

但我认为你误解了 AJAX 请求。 AJAX 请求(异步 Javascript 和 XML)是从浏览器(客户端)到服务器的异步请求。 AJAX 请求 99% 的用途是在应用程序后台处理数据(检索、发布、删除等),但它

不会直接导致页面转换。阅读this问题以获取更详细的解释。

发出 AJAX 请求时,除了数据处理之外的任何操作都将在 EJS/HTML 文件中完成。

让我们看一个使用express框架的小例子:

someView.ejs


<!DOCTYPE html> <html> <head> <!-- set up html page --> </head> <body> <button onclick="getData()">Get some Data</button> <div id="content"> <p>Hi! My name is Dave</p> <p>Today I am 25 years old</p> </div> <script> function getData() { fetch('/data/get', {method: 'GET', headers: {'Content-Type':'application/json'} }) .then( raw_data => raw_data.json() ) .then( data => { document.getElementById("content").innerHTML = `<p>Hi! My name is ${data.name}</p>` + `<p>Today I am ${data.age} years old</p>` }) .catch( err => console.log(err) ) } </script> </body> <html>

main.js


// imports and app configuration app.get('/data/get', (req, res) => { // get data from database/memory, internally from the server, etc. We will use mock data const data = {name: "Johnny", age: 52}; res.send(data); })
页面将呈现一个按钮和 

<div>

 内的文本

<button onclick="getData()">Get some Data</button> <div id="content"> <p>Hi! My name is Dave</p> <p>Today I am 25 years old</p> </div>

现在,如果您单击按钮(不是在代码片段上,因为我们这里没有 NodeJS 服务器),浏览器将向服务器发出获取请求。在服务器上,我们处理数据,在我们的例子中包括约翰尼的姓名和年龄。任何类型的响应,无论是

res.send(...)

还是
res.render(...)
,都不会让浏览器页面加载该数据。相反,您将从 fetch 调用中获取数据,无论是在 
then()
 函数内(如示例中所示),还是使用 async/await 语法,它都会类似于 
let raw_data = await fetch(...).catch(...)
。然后您可以在那里进一步处理数据,就像在我们的示例中一样,我们更改了 div 的innerHTML。所以按下按钮后,它看起来像这样:

<button onclick="getData()">Get some Data</button> <div id="content"> <p>Hi! My name is Johnny</p> <p>Today I am 52 years old</p> </div>

在大多数用例中,您希望根据检索到的数据更改 DOM,就像我们所做的那样。但显然,您不应该像我在本例中那样对 HTML 进行硬编码。相反,您可以创建一个部分来使用一组数据进行渲染。

person.ejs


<p>Hi! My name is <%= person.name %><</p> <p>Today I am <%= person.age %> years old</p>
现在你需要在

someView.ejs

中获取这个文件来渲染它。最简单的方法可能是对文件执行另一个获取请求:

fetch('/views/partials/person.ejs') .then( raw_data => raw_data.text()) .then( data => { const html = ejs.render(data, {name: 'Brian', age: 40}); document.getElementById('content').innerHTML = html; })
但是,要在客户端使用 ejs 变量,您需要从 github

下载

ejs.js
ejs.min.js
并将其像这样 <script src="path/to/file/ejs.min.js"></script> 添加到
<head>
中(有关此方面的更多帮助,查看
这个
问题或在评论中问我)。 剩下的就是将我在这里解释的所有内容结合在一起。祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.