【问题标题】:Is it possible to prevent a form submission if server disconnects?如果服务器断开连接,是否可以防止表单提交?
【发布时间】:2020-08-03 01:04:00
【问题描述】:

假设我有一个提交到 POST 路由 /example 的表单:

<form action="/example" method="POST">
  <input type="text" name="fname"><br>
  <input type="text" name="lname"><br>
  <button type="submit">Send</button>
</form>

app.js:

app.post('/example', (req, res) => {
  ... 
});

server.js

const app = require('./app');

app.listen(3000, () => {
    console.log('server is running on port 3000');
});

如果服务器断开连接,Javascript 是否提供了一种阻止表单提交的方法,以防止网站崩溃?

我在网上搜索过,但找不到任何此类解决此问题的方法。

【问题讨论】:

  • 您可以通过 AJAX 提交表单并捕获/处理客户端代码中的各种错误/故障。
  • 如果我尝试catch,服务器断开连接是否会作为错误传递?
  • 如果“服务器断开连接”是指服务器没有响应,那么我想这会导致某种可识别的错误。这取决于您使用 AJAX 的方式,例如您可能正在使用什么客户端库,或者只是手动使用它。无论您使用的是 AJAX,您都可以找到有关如何处理错误的示例,然后开始测试该特定错误。

标签: javascript html node.js


【解决方案1】:

您可以这样做,但必须以编程方式完成,而不是通过action 属性隐式完成。为此,您可以使用 Promises 中的 then/catch 或使用 async/await 进行 try/catch,如下例所示:

<form>
      <input type="text" name="fname" />
      <br />

      <input type="text" name="lname" />
      <br />

      <button type="submit">Send</button>
    </form>

    <script>
      const form = document.querySelector('form');

      form.addEventListener('submit', async (event) => {
        event.preventDefault();

        const elements = event.target;
        const firstName = elements['fname'].value;
        const lastName = elements['lname'].value;
        const dataToSend = { firstName, lastName };

        try {
          const response = await fetch('/example', {
            method: 'POST',
            body: JSON.stringify(dataToSend),
            headers: { 'Content-Type': 'application/json' },
          });
          const data = await response.json();

          console.log('Data returned from the server', data);
        } catch (error) {
          console.log('Uups! Something went wrong', error);
        }
      });
    </script>

【讨论】:

  • 我认为 firstName 将在 node.js 中使用 const firstName = req.body.firstName; 访问是对的吗?
  • 是的,您是对的,您可以通过正文访问这些变量。您将需要 body-parser 中间件。
  • 我正在使用app.use(bodyParser.urlencoded({ extended: true }));,但由于某种原因仍然未定义:/
  • 这应该可以完成工作,您是在端点定义之前执行它吗?我建议为这种情况创建另一个问题。
猜你喜欢
  • 2013-11-19
  • 2019-03-13
  • 2012-06-16
  • 2022-12-12
  • 1970-01-01
  • 2019-05-25
  • 2019-06-22
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多