【问题标题】:Sending POST request body to web page with NODEJS使用 NODEJS 将 POST 请求正文发送到网页
【发布时间】:2017-12-02 02:28:41
【问题描述】:

我有以下设置: 1) NodeJs 服务器 2) 外部应用

我想接收来自外部应用程序的 POST 请求,并将 POST 请求的正文发送到网页以进行可视化。

到目前为止,我可以成功接收 POST 请求并在服务器控制台中打印它。 我正在使用 express 和 body-parser 来处理服务器和消息正文。

代码如下:

var express = require("express");
var myParser = require("body-parser");
var app = express();

app.use(myParser.json({extended : true}));
app.post("/", function(request, response) {
console.log(request.body); 
});

app.listen(3000);

在 POST 事件中,我只打印正文消息。我什至没有发回响应,因为我知道它对外部应用程序没有用。 现在,对于第二部分,网页上的可视化,我需要在我的应用程序中添加一个“get”事件,由连接到服务器的浏览器提供。

所以我修改了服务器代码如下:

var express = require("express");
var myParser = require("body-parser");
var app = express();

app.use(myParser.json({extended : true}));
app.post("/", function(request, response) {
console.log(request.body); 
app.get("/index.html",function(req,res){
res.end(request.body);});
});

app.listen(3000);

在服务器启动时,我没有收到任何错误,但是如果我在 index.html 资源上打开浏览器,我会收到以下错误:

TypeError: 第一个参数必须是字符串或缓冲区 在 ServerResponse.end (_http_outgoing.js:742:13)

在 /usr/share/myapp.js:10:5

在 Layer.handle [as handle_request] (/usr/share/myapp/node_modules/express/lib/router/layer.js:95:5)

在下一个(/usr/share/myapp/node_modules/express/lib/router/route.js:137:13)

在 Route.dispatch (/usr/share/myapp/node_modules/express/lib/router/route.js:112:3)

在 Layer.handle [as handle_request] (/usr/share/myapp/node_modules/express/lib/router/layer.js:95:5)

在 /usr/share/myapp/node_modules/express/lib/router/index.js:281:22

在 Function.process_params (/usr/share/myapp/node_modules/express/lib/router/index.js:335:12)

在下一个(/usr/share/myapp/node_modules/express/lib/router/index.js:275:10)

在 jsonParser (/usr/share/myapp/node_modules/body-parser/lib/types/json.js:109:7)

你能帮我找出问题所在吗?

【问题讨论】:

  • 你在一个 post 处理程序 app.post(...) 中有一个 get 处理程序 app.get(...)
  • 将 res.end 改为 res.end(response.body)

标签: node.js express


【解决方案1】:

这里发生了一些事情。首先,您已经在 app.use 方法中声明了 app.get 和 app.post 方法,您需要将它们分开,如下所示:

app.use(myParser.json({extended : true}));

app.post("/", function(request, response) {
    console.log(request.body); 
});

app.get("/index.html",function(req,res) {
    res.end(request.body);
});

您还需要确保在 get 方法中使用 res.end 时声明您的内容类型。

查看 bodyparser 的文档以获取与您想要实现的目标相近的示例,它可能会对您有所帮助:https://github.com/expressjs/body-parser#expressconnect-top-level-generic

【讨论】:

    【解决方案2】:

    您无法通过尝试使用从外部应用程序接收到的 POST 请求的 request.body 响应网页的 GET 请求来将从外部应用程序接收到的数据发送到网页。做你想要实现的最简单的方法就是这样。

    app.use(myParser.json({extended : true}));
    
    app.post("/putData", function(request, response) {
        //store data received from the app in the database.
    });
    
    app.get("/getData",function(req,res) {
        //retrieve data from the database and send the response to the browser.
    });
    

    您还可以使用套接字实时更新网页上的数据。

    【讨论】:

    • 您好,感谢您的回答。不幸的是,我无法访问那台机器上的数据库。我不清楚为什么我不能这样做。我知道这不能用 Apache 完成,因为只有请求发送者才能获得资源,但我相信它可以用 NodeJs 完成。我对这个问题很困惑。如果有人能帮助我理解这一点,我将不胜感激
    • @Siddharth 如何在不使用数据库的情况下存储数据,然后为 GET 请求检索它?
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2020-09-04
    • 2019-05-16
    相关资源
    最近更新 更多