【问题标题】:Nodejs: Display POST data from another websiteNodejs:显示来自另一个网站的 POST 数据
【发布时间】:2018-09-24 14:05:08
【问题描述】:

在过去的 6 个小时里,我一直在试图弄清楚,但我没有想法..

我想要完成的事情:

我想显示一个像这样的 JSON 数据

movie {title: " xxxxx", seed: "number", url: "zzzzzzzzz"}

我想将它显示在我的节点服务器上(通过玉),但我现在完成的是使用以下代码通过 POST 请求将它从网站发送到我的节点服务器:

我的 JS 脚本

var http = new XMLHttpRequest();
var url = "http://localhost:8080/";
var params = arr; <------ My JSON data
http.open("POST", url, true);

//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

http.onreadystatechange = function() {//Call a function when the state changes.
    if(http.readyState == 4 && http.status == 200) {
        console.log(http.responseText);
    }
}
http.send(params);

在我的网站上的谷歌浏览器开发者工具中使用上述代码后,我实际上有该数据,我在我的节点中收到 JSON 数组,这是我的节点代码:

我的 app.js 节点服务器

const http = require("http");
const express = require('express');
const app = express();
const myParser = require('body-parser');


app.set('views', __dirname + '/views')
app.set('view engine', 'jade')
app.use(express.static(__dirname + '/public'))
app.use(myParser.urlencoded({ extended: false }));
app.use(myParser.json())

var allowCrossDomain = function (req, res, next) {
  res.header('Access-Control-Allow-Origin', "*");
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
}

app.use(allowCrossDomain);

app.get('/', function (req, res, next) {
  res.render('index');
})

app.get('/tl', function (req, res, next) {
  res.render('tl');
})

app.post("/", function (req, res) {
  response = {
    first_name: req.body
  };

  console.log('SHOW ME BODY')
  console.log(req.body);

  res.send('You sent: this to Express');
});

app.listen(8080);

这就是我在节点命令提示符中收到的内容:

{ '[{"title":" SOME-MOVE-TITLE","seed":"NUMBER","url":"https://SOMEURLS.COM', etc. etc. etc.

最后是我的 layout.jade 文件

doctype
html
  head
    title Bolo Node Server
    link(rel="stylesheet", type="text/css", href="stylesheet/style.css")
  body
    header
      h1 My Site
      block content
    footer
      p Running on node with Express, Jade and Stylus

还有 index.jade

extend layout

block content
  p= 'Block content works'
  script.
    if req.body != undefined
      div(id='data')= req.body

关于如何显示收到的 json 数组,我真的没有办法了……请帮帮我

更新

我的 index.jade

扩展布局

block content
  p= 'Block content works'
  div(id='data')
    pre
      test= jsonString

我的 app.js 现在看起来像这样:

app.get('/', function (req, res, next) {
  res.render('index');
})

app.post("/", function (req, res) {
  // Get string representation
  var jsonString = JSON.stringify(req.body || {}); // use JSON.stringify(req.body || {}, null, 2) for formatted JSON
  console.log(jsonString);
  res.render('index', {test: jsonString});

  //res.send('You sent: this to Express');
});

我在节点命令提示符中看到数据,但在我的本地网站http://localhost:8080/ 上看不到它,div(id='data') 显示为空.. 什么都没有,我如何在那里获取 jsonString? ?我想让它显示我本地网站上的数据..

**

更新

**

我最终只是将数据放入 sqlite3 数据库,然后通过 GET 请求检索数据,最后将其放入我的玉模板。我以为我可以绕过而不使用 sqlite3,但我不知道怎么做。

【问题讨论】:

    标签: javascript json node.js post request


    【解决方案1】:

    您应该在模板中传递数据。

    res.render('index', {data: 'data'});
    

    并显示:

    data = data
        p #{data}
    

    【讨论】:

    • res.render 应该放在哪里?里面 app.post('/', function(){}) ??每当我将“数据”放入玉文件中时,它都会显示“数据未定义”,但我在控制台日志中看到它
    • @Bolo POST 用于提交数据。 GET 用于从服务器检索数据。 res.render 应该始终进入 app.get 路由。
    • 好的伙计,告诉我如何渲染从另一个网站的帖子中获得的数据?我是否必须重新加载我的本地网站,放置一些提交按钮或其他东西?从昨天开始,我一直在试图弄清楚这一点......
    • @Bolo 假设您有一个 TODO 列表应用程序。 TODO 列表输入表单在app.get("/") 上呈现,提交时会向app.get("/todos") 发送POST 请求。此路由中的代码将数据保存到变量或数据库中。之后,当您刷新app.get("/") 时,它会向app.get("/todos") 发送GET 请求以获取包含待办事项列表(来自数据库)的JSON 响应,然后您可以根据需要显示数据。我建议您在RESTful APIs 上阅读更多内容。
    【解决方案2】:

    当你说要显示json的时候,如果你只是想看json的内容可以使用res.json

    app.post("/", function (req, res) {
      // Send back the request body if present or else, an empty object
      res.json(req.body || {});
    });
    

    如果您希望它显示在模板中,您可以使用 JSON.stringify(req.body) 获取 json 的字符串表示形式,并通过将其作为局部变量传递给模板在模板中呈现它。

    app.post("/", function (req, res) {
      // Get string representation
      var jsonString = JSON.stringify(req.body || {}); // use JSON.stringify(req.body || {}, null, 2) for formatted JSON
    
      res.render('jsonView',{jsonString});
    });
    

    在你的模板中:

    div(id='data')
      pre
        code = jsonString
    

    【讨论】:

    • 当我粘贴您的代码时,控制台会显示:错误:发送后无法设置标题。
    • 适用于哪种解决方案?第一还是第二?通常当res.send res.json 被多次调用时会发生这种情况。检查你之前的混音器
    • 我正在尝试第一个解决方案,但是没有任何反应?第二个我不知道如何在模板配合中显示它?看看我的 app.post app.post("/", function (req, res) { var jsonString = JSON.stringify(req.body || {}); // use JSON.stringify(req.body || {}, null, 2) for formatted JSON console.log(jsonString); res.render('tl', {test: jsonString}); }); 控制台正在向我显示 jsonString,但是我如何在这里“显示”数据 localhost:8080/tl 这是我的 TL.jade `扩展布局块内容 div(id='data') 预测试= jsonString`
    • 您究竟是如何向该路线发出 post 请求的?如果您正在访问localhost:8080/tl,它实际上从未向localhost:8080/ 发出发布请求,根据上面的代码,您将在其中看到 JSON...您能否更新问题以明确定义预期的行为?
    • 好的,我已经更新了,你能看一下吗?基本上我希望它显示在我的本地网站上,我的意思是我在我的节点命令提示符中看到它,但我没有在我的本地网站上看到它
    【解决方案3】:

    首先你应该解析你的传入数据,就像application/x-www-form-urlencoded一样。您需要先 JSON.parse req.body 并将您的响应编码为 json

    app.post("/", function (req, res) {
      var  response = try { JSON.parse(req.body) } catch(e) { console.error('Invalid Data') };
      res.json(response || {});
    });
    

    您还可以将您的数据作为“application/json”从您的客户端 JS 发送并保存接收 JSON 直接到req.body

    希望对你有帮助

    更新(如果您想通过客户端上的异步请求追加新数据)

    在这个post 中,您可以看到XmlHttpRequestjquery $.ajax() 的使用,这与在您的服务器上呈现DOM 后的异步请求的概念基本相同。

    想象第 3 步是您的 Jade 呈现的 HTML

    【讨论】:

    • 我在控制台日志中看到了我从网站发送到节点服务器的数据,但我如何在 m index.jade 中实际显示数据??
    • 我认为你在这里混淆了概念。一方面,你有 Jade,它是一个服务器端呈现的模板框架另一方面,你想对你的快速服务器上的端点进行异步 POST 调用以检索 JSON 数据如果你希望你的数据直接呈现到 Jade 中,您需要在渲染之前将数据嵌入到模板变量中如果您想要在 Jade 已经渲染后进行异步调用,您将需要处理 XMLHttpRequest 回调,并使用本机 javascript、jquery 或任何您想要的在 DOM 元素中追加新数据
    【解决方案4】:

    我最终只是将数据放入 sqlite3 数据库,然后通过 GET 请求检索数据,最后将其放入我的玉模板。我以为我可以绕过而不使用 sqlite3,但我不知道怎么做。

    这里是代码

    app.post("/", function (req, res) {
      var jsonString = JSON.stringify(req.body || {});
      db.serialize(function () {
        var stmt = db.prepare("INSERT INTO movies (id, title, seed, url) VALUES (?,?,?,?)");
        for (var i = 0; i < req.body.length; i++) {
          var d = new Date();
          var data = req.body;
          var n = d.toLocaleTimeString();
          stmt.run(i, req.body[i].title, req.body[i].seed, req.body[i].url);
        }
        stmt.finalize();
      });
      res.send('You sent: this to Express');
    });
    

    从数据库中检索数据

    app.get('/tl', function (req, res, next) {
      db.all('select * from movies', function (err, rows) {
        if (err)
          return next(err);
        var dataO = [];
        rows.forEach(function (row) {
          dataO.push(row);
        })
        res.render('tl', { dataO: dataO });
      })
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多