我有一个简单的博客应用程序,使用 Node.js 作为后端,使用 ejs 作为前端。我能够使用带有输入类型提交的网络表单来发布博客,调用发布路由。这很好用。但现在我正在尝试为每个帖子实现一个删除按钮。我发现让按钮(在表单之外)与节点一起使用的唯一方法是使用 ajax 和 fetch,如下所示:
这会注册按钮单击并触发删除功能,但会产生当我尝试发送响应时页面无法呈现的问题: res.render(path.resolve("views/index.ejs"), data);这显然就是ajax 的工作原理。 我发现可以在不使用ajax的情况下做到这一点,使用带有节点的jquery,这也是可能的,但不是直接的,而且我不知道如何做。
我是node和ejs的绝对初学者,所以非常欢迎任何帮助! (P.S:我尝试在这个问题中包含我的代码,但页面坚持告诉我它的格式不正确并且不允许我..)
按下删除按钮会触发 /delete 路由和删除功能,但不会渲染页面。
我发现可以在不使用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>
中(有关此方面的更多帮助,查看这个问题或在评论中问我)。 剩下的就是将我在这里解释的所有内容结合在一起。祝你好运!