【问题标题】:Express JS on form submit stay on page表单上的 Express JS 提交停留在页面上
【发布时间】:2017-01-11 22:48:26
【问题描述】:

我知道这可能是一个简单的问题,并且在某处有教程,但我似乎找不到它。 我使用express-generator生成了一个应用程序,并在路由中添加了一个简单的表单

views/form.ejs

<div>
<h1>This is <%= name %></h1>
<form action="/form" method="POST">
    <input type="text" name="question" placeholder="question"><br>
    <input type="text" name="answer" placeholder="answer"><br>
    <input type="submit">
</form>

我想要做的是在表单提交后处理请求而不对页面做任何事情。基本上我希望它保持不变,所以我尝试了以下

routes/index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.get('/form', function (req, res) {
    res.render('form', {name: "My Name"});
});

router.post('/form', function (req, res) {
    console.log(req.body);
});

module.exports = router;

浏览器一直在等待来自服务器的响应。我尝试添加next(),但它给出了一个错误,我也尝试从函数返回但没有用。 那么如何在不响应客户端的情况下发出发布请求或处理任何路由?

【问题讨论】:

标签: javascript node.js forms express


【解决方案1】:

我想这里的问题是“你为什么想要?”;您想通过允许不响应客户端的发布请求来实现什么?

我认为,您最好的选择是执行 res.json(successOrFailureMessage) 以便您的客户端应用程序了解发生的事情并可以从那里做某事(或实际上什么也不做)。否则它将在等待响应时挂起。

【讨论】:

  • 我只是想做一些数据库操作,而目前不必给客户端任何响应
  • 您需要给客户某种响应(否则如果出现错误,您会怎么做?不让客户知道?),您的问题是如何处理响应而不是实际发送的内容。 :)
  • 我完全理解您的概念,但假设这是一个错误,我会想回复一个包含错误消息的 json,“无需”刷新页面或重定向到任何地方。如果没有错误,那么这个 json 对象仍然提供给客户端,但现在是空的。这里的问题是,每当调用 res.send() 时,视图就会改变,并且“不是”我想要发生的事情
  • 哦,你知道吗,我的错 - 我知道我说过你应该使用 res.send,但实际上我的意思是 res.json!这应该可以解决您的页面刷新问题。 :) 我已经编辑了我之前的回复。
  • 对不起,但这也不起作用:/它提供与 res.send() 相同的行为
【解决方案2】:

将您的 post 代码更新为:

router.post('/form', function (req, res) {
    console.log(req.body);
    res.render('form', {req: req.body});
});

【讨论】:

    【解决方案3】:

    根据 cmets 更新了答案

    将参数传递给ejs:

    app.get('/form', function(req, res) {
    res.render('form.ejs', {
        question: req.body.question,
        answer: req.body.answer
    });
    

    【讨论】:

    • 不起作用。 res.send({}) 重定向到表单被移除的路径并打印一个空的 json 对象
    • 这取决于您的调用方式:通过 ajax 或完整形式的帖子。对于完整形式的帖子,请执行一些操作,然后重定向到 /form 或您再次来自的任何地方。
    • 我正在通过提交完整表单的方式致电。重定向到表单会丢失所有数据。我想保持填写表格,而不必通过将它们传回路线来手动插入它们。我在某处读到,这可能只能通过 ajax 或 Angular 之类的...有什么想法吗?
    • 没有什么是“唯一”可以通过 Angular 实现的。这似乎是一个要解决的奇怪问题,但是,假设您在这里疯狂的方法,也许您可​​以在 POST 之后将用户的数据作为对象返回,并将它们重定向到他们正在填写的表单,并重新填充表单的数据使用您刚刚返回给他们的数据。
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2015-01-02
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2013-06-21
    • 2015-08-14
    相关资源
    最近更新 更多