【问题标题】:Sending data from NodeJS without re-rendering the whole page?从 NodeJS 发送数据而不重新渲染整个页面?
【发布时间】:2016-01-14 03:05:42
【问题描述】:

我编写了一个非常简单的 Express NodeJS 应用程序,它从表单中的用户读取数据并发送到服务器。服务器进行一些操作并将新字符串返回到同一页面。但是,要将新数据返回到当前加载的页面,我必须重新渲染页面。我只想通过从节点 js 发送字符串来更新字符串,而不是重新渲染整个页面。

我有以下问题:

  • 如何从 NodeJS 服务器发送数据而不重新渲染整个页面?
  • 为什么用Post方法发送数据,在req.body.XXX提供数据,但用Get方法发送数据,返回undefinedreq.body.XXX

     <html>
       <head>
        <title><%= title %></title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
       </head>
       <body>
        <h1><%= title %></h1>
        <p>Welcome to <%= title %></p>
    
        <form id="myForm" action = "http://localhost:3000/testing" method="post"> 
          Enter Url: <input type="text" name="urlEditText"/>
          <br />
          <br />
          Shortened Url:<%= shortenedUrl %> 
          <br />
          <br />
          <input id="myButton" type="button" value="Submit" />
         </form>
        </body>
     </html>
    

index.js:

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

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express', shortenedUrl: ''});
    console.log("hello inside index.js method 0");
});


// passing an updated string back to the page
router.post('/yolo', function(req, res, next) {
    res.render('index', { title: 'NewTitle', shortenedUrl: req.body.urlEditText});
    console.log("hello inside index.js method 1");
});

编辑:

用于提交的 JQuery 脚本:

 $(document).ready(function() {
    $("#myButton").bind('click', function() {

      event.preventDefault();
      $("#myForm").submit(function() {
         document.write("button clicked calling yolo script");
      });

      $.post('/yolo', function() {
        document.write("button clicked calling yolo script");
        alert("yolo");
      });

    });

【问题讨论】:

  • 你不只是在寻找常规的 ajax 吗?
  • 另外,对于GET请求,数据在req.query
  • 尝试将 socket.io 添加到您的应用程序中。它提供了向客户端发送数据的最简单方法,无需客户端多次请求。
  • @adeneo 请原谅我在 Web 开发方面的文盲,但我认为 ajax 是针对客户端的。那么如何使用ajax将数据从Server发送到客户端呢?
  • 您正在将数据从表单提交到服务器,服务器对数据进行处理并在新页面中返回。这就是 ajax 的用例,它是它的确切用例,从客户端发送数据,向该请求返回数据等。或者您是否需要在客户端不要求的情况下将数据从服务器随机推送到客户端.

标签: javascript node.js express


【解决方案1】:

我建议使用 socket.io 之类的东西,这样您就可以在不重新加载页面的情况下从服务器发送和接收数据。这是他们网站上的一个简单示例:

服务器(app.js)

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

客户端(index.html)

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

【讨论】:

    【解决方案2】:

    res.render 仅用于呈现页面。在您的情况下,您很可能需要res.json({title: 'newTitle', ...})

    至于第二个问题,req.body 仅填充了 POSTPUT 请求的数据。对于 GET,您可以依赖 req.queryreq.params,具体取决于您如何组织 API 路由

    【讨论】:

    • 第二个参数大概是为了模板,比如EJS,和JSON没有关系?
    • 他想在不重新渲染页面的情况下更新字符串,因此需要发出ajax请求并且应该以JSON(或其他格式)的形式进行响应。他没有问ajax,他问的是如何从SERVER发回数据
    • res.render发回数据的方式与res.json完全相同,后者只是添加了一组标头并将对象字符串化,但是您看到的对象是用于模板的,它被传输了到模板等。在进行同源 ajax 调用时,返回什么并不重要,JSON 是一种很好的数据格式,但它也可以是 HTML 或中国诗歌。
    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 2015-08-15
    • 1970-01-01
    • 2018-03-09
    • 2015-12-25
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多