Node.js Express.js未根据post请求发送html文件
我只是想在POST请求时发送HTML文件。我百分之百肯定它一小时前还在工作。从那以后,我不明白为什么它突然不起作用了 服务器路由器:Node.js Express.js未根据post请求发送html文件,node.js,express,http-post,backend,sendfile,Node.js,Express,Http Post,Backend,Sendfile,我只是想在POST请求时发送HTML文件。我百分之百肯定它一小时前还在工作。从那以后,我不明白为什么它突然不起作用了 服务器路由器: const express = require('express'); const router = express.Router(); const cors = require('cors'); const path = require('path'); const auth = require('../middleware/auth.js'); // HOM
const express = require('express');
const router = express.Router();
const cors = require('cors');
const path = require('path');
const auth = require('../middleware/auth.js');
// HOME ROUTE
router.options('/', cors());
router.get('/', cors(), (req, res) => {
res.status(201).sendFile(path.resolve(__dirname, '../', '../', 'public', 'index.html'));
});
router.post('/', cors(), (req, res) => {
res.status(201).sendFile(path.resolve(__dirname, '../', '../', 'view', 'manager.html'));
});
服务器没有错误
index.html
<form method="POST" autocomplete="off">
<input id="username" type="text" name="username" placeholder="Username" onchange="updateUsername(event)"><br>
<input id="password" type="password" name="password" placeholder="Password" onchange="updatePassword(event)"><br>
<button onclick="submitFunc(event)">LOGIN</button>
</form>
<script>
let username_value = document.querySelector('#username').value;
let password_value = document.querySelector('#password').value;
function updateUsername(e) {
username_value = e.target.value;
}
function updatePassword(e) {
password_value = e.target.value;
}
async function submitFunc(e) {
e.preventDefault();
let response = await fetch('/', {
headers: { 'Content-Type': 'application/json' },
method: 'POST',
body: JSON.stringify({
username: username_value,
password: password_value
})
});
console.log(response);
}
登录
让username_value=document.querySelector('#username').value;
让password_value=document.querySelector('#password').value;
函数updateUsername(e){
username_value=e.target.value;
}
函数更新密码(e){
密码_值=e.target.value;
}
异步函数submitFunc(e){
e、 预防默认值();
let response=wait fetch(“/”{
标题:{'Content-Type':'application/json'},
方法:“POST”,
正文:JSON.stringify({
用户名:username\u值,
密码:密码值
})
});
控制台日志(响应);
}
请注意,登录逻辑本身不是问题。由于这个问题,我修改了很多代码
向“/”发送POST请求时,这是登录到客户端控制台的响应:
因此,抓取本身似乎工作得很好。只是新的HTML文件并没有取代当前的HTML文件。我如何着手解决这个问题?您需要实际阅读响应
wait fetch(…)
只获取标题并留下一个可读流,其中的内容等待您使用response.json()
或response.text()
读取实际内容,具体取决于您期望的数据类型
更改为:
async function submitFunc(e) {
e.preventDefault();
try {
let response = await fetch('/', {
headers: { 'Content-Type': 'application/json' },
method: 'POST',
body: JSON.stringify({
username: username_value,
password: password_value
})
});
// this assumes the response is text or html,
// use response.json() if the response is json
let data = await response.text()
console.log(data);
} catch(e) {
console.log(e);
// decide what to do here if there was an error with the fetch() call
}
}
您可以看到用于读取正文内容的各种不同方法
此外,如果您使用
fetch()
发出请求,服务器的响应将返回到您网页中的Javascript。它不会自动显示在浏览器中。如果您希望它显示在浏览器中,则可以让表单以本机方式发布(不使用Javascript),或者您必须手动编写Javascript以接收响应,然后自己将其插入页面内容。请将代码以文本形式发布,而不是以屏幕截图形式发布。这样人们就可以复制/粘贴到答案中,而无需重新键入所有内容。它还允许为搜索建立适当的索引,允许屏幕阅读器看到它,等等。。。始终将代码作为文本发布(然后在此处正确格式化为代码),而不要作为屏幕截图发布。此外,请显示发送此请求的客户端代码,因为您似乎正在获取标题,而不是实际读取响应流以获取内容(如body:readableStream
部分所示)。@jfriend00 Edited!我之所以发送身体数据,是因为它基本上是一个简单的登录逻辑。我的服务器现在没有身份验证逻辑,因为我删除了所有内容以发现问题。谢谢回复。我最初尝试了response.json(),然后(res=>console.log(res))代码>。如果我不想使用内置表单,我将如何替换当前的HTML?@激情学习者-可能document.body.innerHTML=data
。这假设数据
只是HTML(而不是页面的整个结构)。如果您只是想要正常的表单行为,为什么不让浏览器自动发布表单,然后它会自动显示返回的内容呢。当您需要执行浏览器不会自动为您执行的操作时,应使用Javascript。表单中没有任何东西需要使用Javascript发布,甚至没有任何好处。事实上,Javascript更为复杂。@PictureAtelearner-只需添加表单属性action=“/”
,删除Javascript,浏览器就会帮您完成。默认情况下,浏览器将发送内容类型application/x-www-form-urlencoded
,因此您希望express中间件为您解析该内容类型,以便您可以在express请求处理程序中自动获取表单参数。顺便说一句,我喜欢你的用户名。@PictureAtelearner-FYI,如果你的回复是JSON,你到底想在页面中插入什么?在将其插入页面之前,必须将其转换为HTML或浏览器DOM对象。您使用此代码的目标不明确。@earner-您只得到一个响应和一种内容类型。因此,您可以发送HTML或JSON作为响应。如果发送JSON,您可以将HTML放入JSON序列化对象的一个属性中,然后您的接收代码必须知道如何提取该HTML并对其进行处理。