Express 向快速路线发送POST请求-收到表单数据后,不会触发res.render

Express 向快速路线发送POST请求-收到表单数据后,不会触发res.render,express,ejs,Express,Ejs,我正在尝试创建一个简单的应用程序,在其中上传一张图片,并在html画布上绘制该图片,以便我可以进行一些简单的像素操作 现在我有了根渲染的GET方法,一个带有文件读取器和画布的EJS模板。 通过脚本标记将代码附加到EJS文件的底部,我将上传的图像绘制到画布上,以便读取每个像素的rgb值 然后,我尝试将这些rgb值发送到应用程序中的POST路由(通过fetch),但它没有按预期工作 app.post("/", (req, res)=>{ console.log(&q

我正在尝试创建一个简单的应用程序,在其中上传一张图片,并在html画布上绘制该图片,以便我可以进行一些简单的像素操作

现在我有了根渲染的GET方法,一个带有文件读取器和画布的EJS模板。 通过脚本标记将代码附加到EJS文件的底部,我将上传的图像绘制到画布上,以便读取每个像素的rgb值

然后,我尝试将这些rgb值发送到应用程序中的POST路由(通过fetch),但它没有按预期工作

app.post("/", (req, res)=>{
    console.log("inside post");
    console.log(req.body);
    res.render("test", {result: req.body});
    console.log("after res.render");
});
包括请求主体在内的所有三个控制台日志都在终端中正确打印,但测试模板未呈现。它只是停留在应用程序启动时使用的同一个“索引”视图上

有人能告诉我为什么会这样吗?我还将控制台日志包含在ejs模板的脚本标记中,这些日志仅显示在浏览器中,而不显示在启动express应用程序时使用的终端中。如何在post方法中渲染视图?

首先 如果使用类似AJAX的或,浏览器将不会呈现
测试
页面。
因为它是异步的,您可以看到。
您需要使用带有以下代码的FormPost


转到另一页
但是,如果您使用表单post,您的页面(可能是“index.ejs”)将被替换为“test.ejs”

换句话说,
浏览器使用表单POST请求的响应加载新页面。
但浏览器将AJAX请求的响应传递给回调,并在js中触发回调。
浏览器以不同的方式处理这两种类型的请求(Form Post和AJAX Post)。
两者的共同点是向服务器发送数据

因此,在您的情况下,
res.render
被成功触发。
让我给你举个例子。这是我的服务器代码

const express=require('express'))
const app=express()
应用程序集(“查看引擎”、“ejs”)
应用程序获取(“/”,(请求、恢复、下一步)=>{
res.render(“测试”)
})
app.post(“/test)”,(请求、回复、下一步)=>{
res.render(“其他测试”)
})
app.listen(3000)
然后进入chrome中的网络选项卡,您将看到请求。
在这里,这个请求触发express方法

但是,反应如何

嗯,这是一个html这意味着
res.render(“其他测试”)
被正确触发。

您将发现控制台输出显示“触发器响应”,在我的获取中触发了哪个回调。
页面仍然停留在“test.ejs”中。

接下来,我在test.ejs中添加以下代码


转到另一页
页面将是这样的

单击后,您将发现浏览器显示“其他测试”内容

这是form post和ajax post之间的区别

第二 您将脚本标记放入ejs模板。
Express将使用ejs引擎将您的ejs模板呈现为html页面。
当它变成html页面后,意味着所有脚本都在浏览器中运行,而不是在nodejs终端中运行。

首先 如果使用类似AJAX的或,浏览器将不会呈现
测试
页面。
因为它是异步的,您可以看到。
您需要使用带有以下代码的FormPost


转到另一页
但是,如果您使用表单post,您的页面(可能是“index.ejs”)将被替换为“test.ejs”

换句话说,
浏览器使用表单POST请求的响应加载新页面。
但浏览器将AJAX请求的响应传递给回调,并在js中触发回调。
浏览器以不同的方式处理这两种类型的请求(Form Post和AJAX Post)。
两者的共同点是向服务器发送数据

因此,在您的情况下,
res.render
被成功触发。
让我给你举个例子。这是我的服务器代码

const express=require('express'))
const app=express()
应用程序集(“查看引擎”、“ejs”)
应用程序获取(“/”,(请求、恢复、下一步)=>{
res.render(“测试”)
})
app.post(“/test)”,(请求、回复、下一步)=>{
res.render(“其他测试”)
})
app.listen(3000)
然后进入chrome中的网络选项卡,您将看到请求。
在这里,这个请求触发express方法

但是,反应如何

嗯,这是一个html这意味着
res.render(“其他测试”)
被正确触发。

您将发现控制台输出显示“触发器响应”,在我的获取中触发了哪个回调。
页面仍然停留在“test.ejs”中。

接下来,我在test.ejs中添加以下代码


转到另一页
页面将是这样的

单击后,您将发现浏览器显示“其他测试”内容

这是form post和ajax post之间的区别

第二 您将脚本标记放入ejs模板。
Express将使用ejs引擎将您的ejs模板呈现为html页面。

当它变成html页面后,这意味着所有脚本都在浏览器中运行,而不是在nodejs终端中运行。

也许我误解了-它在后台运行是什么意思,所以我需要使用form post?我很困惑,因为我以前使用form post将数据发送到express routes,并将该数据作为参数传递给res.render()。如果我使用AJAX将数据发送到我的快速路线(并且可以在该路线中读取数据),那么它与form post方法有何不同?在这两种情况下,我不只是尝试将数据发送到“app.post('/')并尝试使用传入的数据调用res.render吗?我主要解释的是,当您使用fetch API(一种AJAX)来执行post时,为什么express不呈现test.ejs。我的意思是浏览器使用表单POST请求的响应来加载新页面。但AJAX请求的响应在js中传递给回调。浏览器处理这两个t
<!-- test.ejs -->
<h1>this is test pages.</h1>
<!-- other-test.ejs -->
<h1>this is other test pages.</h1>