Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express.js未根据post请求发送html文件_Node.js_Express_Http Post_Backend_Sendfile - Fatal编程技术网

Node.js Express.js未根据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

我只是想在POST请求时发送HTML文件。我百分之百肯定它一小时前还在工作。从那以后,我不明白为什么它突然不起作用了

服务器路由器:

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并对其进行处理。