nodejs从POST请求中获取原始的请求体
nodejs从POST请求中获取原始的请求体
我在TradingView中设置了一个警报,它会发送一个带有请求的webhook到我的服务器,请求的主体是一些信息。这个webhook发送的是纯文本,而不是JSON数据。\n我想知道是否有办法获取到这个纯文本数据。\n这是JSON格式的webhook\n\n然后这是我的代码\n
const express = require('express'); const app = express(); app.post('/webhook', (req, res) => { }) app.listen(8080, () => {console.log("listening on port 8080")})
问题的出现原因是需要从POST请求中获取原始的请求体,但没有使用合适的中间件进行解析。解决方法是使用body-parser中间件来解析和提取HTTP请求的请求体。
首先需要安装body-parser中间件:
$ npm install body-parser
然后在代码中引入并使用它:
const express = require('express'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.text());
更多信息可以参考这个链接:[http://expressjs.com/en/resources/middleware/body-parser.html](http://expressjs.com/en/resources/middleware/body-parser.html)
但是某些情况下body-parser已经被弃用了,所以不能正常工作。在这种情况下,可以参考另一个回答中提供的正确方法来添加中间件。
问题的出现原因:
在上述代码中,当接收到POST请求时,需要从请求中获取原始的请求体内容。然而,在默认情况下,Express框架会对请求体进行解析,并将解析后的内容存储在req.body中。因此,如果直接访问req.body,将只能获取到解析后的内容,而无法获取到原始的请求体内容。
解决方法:
要获取原始的请求体内容,可以通过使用第三方中间件"raw-body"来实现。下面是解决方法的代码示例:
const express = require('express'); const app = express(); const getRawBody = require('raw-body'); app.post('/webhook', (req, res) => { getRawBody(req, { length: req.headers['content-length'], encoding: req.headers['content-encoding'] }, function(err, string) { if (err) return next(err); req.rawBody = string; const { psw, message } = JSON.parse(string); }) }) app.listen(8080, () => {console.log("listening on port 8080")})
以上代码中,我们首先引入了"raw-body"模块,并使用getRawBody函数来获取原始的请求体内容。在getRawBody函数的回调函数中,我们将获取到的原始内容存储在req.rawBody中,并通过JSON.parse将其转换为对象。然后,我们可以通过解构赋值的方式获取psw和message字段的值。这样就可以获取到POST请求的原始请求体内容。
通过上述解决方法,我们可以方便地获取到POST请求的原始请求体内容,以满足特定的业务需求。
问题出现的原因是没有使用body parsing中间件。根据问题描述,如果webhook是纯文本,可以使用express的`express.text()`中间件来解析请求体;如果是JSON格式,则可以使用`express.json()`中间件来解析请求体。以下是解决方法的示例代码:
对于纯文本:
const express = require('express'); const app = express(); app.use(express.text()); app.post('/webhook', (req, res) => { console.log(req.body); // 如果请求的Content-Type是text/plain,那么请求体将被解析为文本。 }) app.listen(8080, () => {console.log("listening on port 8080")});
对于JSON:
const express = require('express'); const app = express(); app.use(express.json()); app.post('/webhook', (req, res) => { console.log(req.body); // 如果请求的Content-Type是application/json,那么请求体将被解析为JSON。 }) app.listen(8080, () => {console.log("listening on port 8080")});
通过使用适当的body parsing中间件,可以从POST请求中获取原始请求体。