标签: body-parser

Express.js POST req.body为空

所以我在server.js文件中有以下代码,我正在运行node.js. 我正在使用express来处理HTTP请求.

app.post('/api/destinations', function (req, res) {
  var new_destination = req.body;
  console.log(req.body);
  console.log(req.headers);
  db.Destination.create(new_destination, function(err, destination){
    if (err){
      res.send("Error: "+err);
    }
    res.json(destination);
  });
});
Run Code Online (Sandbox Code Playgroud)

我在终端中运行以下内容:

curl -XPOST -H "Content-Type: application/json" -d '{"location": "New York","haveBeen": true,"rating": 4}' http://localhost:3000/api/destinations
Run Code Online (Sandbox Code Playgroud)

运行该server.js后打印出以下内容.

{}
{ host: 'localhost:3000',
  'user-agent': 'curl/7.43.0',
  accept: '*/*',
  'content-type': 'application/json',
  'content-length': '53' }
Run Code Online (Sandbox Code Playgroud)

所以req.body是{}.我阅读了其他关于类似问题的Stack Overflow帖子,其中由于正文解析器,内容类型不正确.但这不是问题,因为内容类型是application/json.

任何想法如何获得请求的实际主体?

提前致谢.

javascript json node.js express body-parser

8
推荐指数
2
解决办法
1万
查看次数

如何使用`bodyParser.raw()`来获取原始体?

我正在使用创建Web API Express.该功能允许API用户将文件发送到服务器.

这是我的应用设置代码:

var express = require('express');
var path = require('path');
// ...
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

// API routes
var images = require('./routes/api/img');

var app = express();

app.use(bodyParser.raw());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/api', images);

// ...

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

请注意我正在使用app.use(bodyParser.raw());.

如何从POST请求中获取原始字节?

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

/* POST api/img */
router.post('/img', function(req, res, next) {

  // how do I …
Run Code Online (Sandbox Code Playgroud)

node.js express body-parser

8
推荐指数
3
解决办法
1万
查看次数

node的bodyParser和express的urlencoded中间件有什么区别?

在阅读了两者之后,我仍然无法理解它,可能是语言差异,但请帮助澄清。

express.urlencoded()

返回仅解析 urlencoded 主体并仅查看 Content-Type 标头与类型选项匹配的请求的中间件。此解析器仅接受主体的 UTF-8 编码,并支持 gzip 和 deflate 编码的自动膨胀。

body-parser中间件

在处理程序之前在中间件中解析传入的请求正文,在 req.body 属性下可用。

我知道这express.urlencoded是基于 Nodejs 的body-parser。和两个页面,

https://expressjs.com/en/api.html#express.urlencoded

https://expressjs.com/en/resources/middleware/body-parser.html

甚至说同样的警告:

由于 req.body 的形状基于用户控制的输入,因此该对象中的所有属性和值都不受信任,应在信任之前进行验证。例如,req.body.foo.toString() 可能会以多种方式失败,例如 foo 可能不存在或可能不是字符串,而 toString 可能不是函数而是字符串或其他用户输入。

但最终都给了我一个req.body在请求正文对象中发送的参数。那么为什么我应该使用 body-parser(我必须单独安装)而不是总是使用express.urlencoded()

我知道这不是代码问题,但我提前感谢任何可以列出主要差异的人。

javascript urlencode node.js express body-parser

8
推荐指数
1
解决办法
4399
查看次数

节点Body Parser和cookie解析器有什么作用?我应该使用它们吗?

我已经阅读了所有可以找到的文档,但是我找不到这两个中间件的简单解释.

什么是bodybody-parser指什么?为什么需要解析身体?

同样适用于cookies.我是否正确地cookie-parser"解析"或瘫痪网络用户附带的cookie?

最后,我读过body-parser在Express4中既不安全又不推荐使用.我应该不用吗?

cookies parsing node.js express body-parser

7
推荐指数
2
解决办法
5650
查看次数

使用body解析器传递zip文件

我的节点应用程序使用快递,在我需要通过邮件消息zip文件发送的应用程序(例如从邮递员到节点服务器),目前我使用身体解析器如下,但我想知道这是否正常?

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(bodyParser.text({
    type: 'application/text-enriched',
    limit: '10mb'
}));
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这是有效的,但我想知道我是否正确使用它...

javascript node.js express body-parser

7
推荐指数
1
解决办法
2232
查看次数

ExpressJS Middleware bodyParser 性能很差

前几天我们在Rest API中添加了NewRelic,APM,它是用NodeJS编写的,使用EXPRESS JS作为开发框架。

由于 JSON 解析器中间件,现在我们看到很多用户体验到响应时间很短的情况。

这是 NewRelic 中报告的请求之一: 在此处输入图片说明

钻取报告: 在此处输入图片说明

如您所见,大部分时间都被中间件 JSON 解析器消耗。

我们在想问题可能来自大型 JSON 有效负载,有时是从 API 发出的。但是对于这个响应,如上所示,API 返回了 contentLength=598 的数据,这不应该是太大的 JSON。

在此处输入图片说明

我们还使用了在向下钻取的请求执行屏幕截图中可见的压缩中间件。这应该减少来回发送给客户端的 IO 的大小。

此时我们对初始化时传递给中间件的参数限制有疑问。{limit:50kb} 但是在本地测试时它没有任何区别。

在此处输入图片说明

我们在考虑用 protobuf 切换,还考虑了异步解析 JSON 负载的方式。因为中间件使用的 JSON.parse 是同步进程,停止非阻塞 IO。

但是在开始这些更改和实验之前,请如果有人遇到同样的问题,请提出任何可能的解决方案。

基准测试:

对于本地/阶段环境的基准测试,我们使用 JMeter 并生成负载来检查何时可能发生此类超时,但在使用 JMeter 进行测试时我们无法捕捉到这一点。

谢谢你。

performance node.js express newrelic body-parser

7
推荐指数
1
解决办法
793
查看次数

req.body在服务器端未定义

我正在研究在服务器端使用node,express,mysql的 app .我已经在server.js文件上写了几个API,当我试图使用Postman访问那些时,req.body总是未定义的.

这是我的server.js配置.

var express = require('express');
var mysql = require('mysql');
var cors = require('cors');
var bodyParser = require('body-parser');
var wrench = require("wrench");
var fs = require('fs');
var path = require("path");
var mkdirp = require('mkdirp');
var walk = require('walk');
var fse = require('fs-extra');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
var crypto = require('crypto');

app.use(cors());

app.use(bodyParser.urlencoded({limit: '50mb',extended: false}));
app.use(bodyParser.json({limit: '50mb'}));

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'pass',
    database: 'dbname'
});


connection.connect(function(err) { …
Run Code Online (Sandbox Code Playgroud)

node.js express body-parser

6
推荐指数
1
解决办法
920
查看次数

使用Express处理最佳实践

我正在写一个实现用户管理系统的网站,我想知道我必须考虑哪些关于表单处理的最佳实践.

特别是性能,安全性,SEO和用户体验对我来说非常重要.当我处理它时,我遇到了几个问题,我没有找到一个完整的节点/快速代码片段,在那里我可以找出我以下的所有问题.

使用案例:有人将更新其个人资料的生日.现在我正在对同一个URL执行POST请求以处理该页面上的表单,POST请求将使用302重定向到同一URL进行响应.

关于表单处理的一般问题:

  1. 我应该为表单处理执行POST请求+ 302重定向,还是像AJAX请求那样做其他事情?
  2. 我应该如何处理无效的FORM请求(例如,无效登录或电子邮件地址已在注册期间使用)?

表达有关表单处理的具体问题:

  1. 我假设在将任何内容插入我的数据库之前,我需要清理并验证服务器端的所有表单字段.你会怎么做?

  2. 我读了一些关于CSRF的事情,但我从未实施过CSRF保护.我也很高兴在代码片段中看到它

  3. 使用Express处理表单时是否需要处理任何其他可能的漏洞?

示例HTML/Pug:

form#profile(method='POST', action='/settings/profile')
    input#profile-real-name.validate(type='text', name='profileRealName', value=profile.name)
    label(for='profile-real-name') Name

    textarea#profile-bio.materialize-textarea(placeholder='Tell a little about yourself', name='profileBio')
        | #{profile.bio}
    label(for='profile-bio') About

    input#profile-url.validate(type='url', name='profileUrl', value=profile.bio)
    label(for='profile-url') URL

    input#profile-location.validate(type='text', name='profileLocation', value=profile.location)
    label(for='profile-location') Location

    .form-action-buttons.right-align
        a.btn.grey(href='' onclick='resetForm()') Reset
        button.btn.waves-effect.waves-light(type='submit')
Run Code Online (Sandbox Code Playgroud)

路由处理程序示例:

router.get('/settings/profile', isLoggedIn, profile)
router.post('/settings/profile', isLoggedIn, updateProfile)

function profile(req, res) {
    res.render('user/profile', { title: 'Profile', profile: req.user.profile })
}

function updateProfile(req, res) {
    var userId = req.user._id
    var form = req.body
    var profile = { …
Run Code Online (Sandbox Code Playgroud)

security node.js express body-parser

6
推荐指数
1
解决办法
976
查看次数

如何更改Sails JS中间件的默认配置

我试图改变Sails JS应用程序的设置,并且有点麻烦将参数传递给body-Parser以更改默认设置.

我之前有这里描述的问题:发布更大的文件

我相信通过更改默认的'limit'选项可以正确回答这个问题,因为100kb的默认大小减去formData对象的33%开销与我能够/不能发送的文件大小非常一致.所以提出的解决方案是这样的:

var bodyParser = require('body-parser');
...
app.use(bodyParser.urlencoded( { limit: 1048576 } )); 
Run Code Online (Sandbox Code Playgroud)

但我无法在我的Sails应用程序中实现该解决方案.我已经阅读了关于更改中间件设置的Sails文档,并在我的config/http.js文件中尝试了以下内容...

第一次尝试 - 包装

/**
 * HTTP Server Settings
 * (sails.config.http)
 */

module.exports.http = {

middleware: {

  order: [
   'startRequestTimer',
   'cookieParser',
   'session',
   'refreshSessionCookie',
   'bodyParserInit',
   'bodyParser',
   'handleBodyParserError',
   'compress',
   'methodOverride',
   'poweredBy',
   '$custom',
   'requestLogger',
   'router',
   'www',
   'favicon',
   '404',
   '500'
  ],

   bodyParserInit   : (function (){
     let bodyParser = require('body-parser');

     return bodyParser( { extended: true, limit: 1073741824 } )
   })(),

  )
},

// cache: 31557600000 …
Run Code Online (Sandbox Code Playgroud)

javascript middleware node.js sails.js body-parser

6
推荐指数
1
解决办法
163
查看次数

增加 apollo-server-express 中的身体限制大小

我正在尝试使用 apollo-server-express 中的上传标量将文件上传到网络服务。我可以将小文件(10 多字节)上传到网络服务,但无法发送更大的文件。

我做了一些搜索,发现我可以使用 body-parser 包以及在中间件中设置的 bodyParserConfig 选项来更改主体大小限制。我试过实现这一点,以及在快递应用程序本身中实现它,但似乎都没有工作。

bodyParserConfig 示例片段

const bodyParserConfig = bodyParser.urlencoded({limit: '50mb', extended: 'true', parameterLimit: 10000});


server.applyMiddleware({ app, path: process.env.GRAPHQL_ENDPOINT, bodyParserConfig});
Run Code Online (Sandbox Code Playgroud)

我不确定是否需要在 apollo 服务内部使用 json 方法,它调用 json(config) 所以我尝试了这个,但它也没有工作。

const bodyParserConfig = {limit: '50mb'};


server.applyMiddleware({ app, path: process.env.GRAPHQL_ENDPOINT, bodyParserConfig});

Run Code Online (Sandbox Code Playgroud)

表达示例代码段

app.use(bodyParser.json({limit: '50mb'}))
Run Code Online (Sandbox Code Playgroud)

尝试这两个选项,以及来自Error: request entity too large 的选项似乎对我不起作用。网络服务(Nifi HTTPHandleRequest)告诉我它无法接收内容。大多数解决方案示例(如上面的示例)专门用于 express 而不是 apollo-express-server,所以我不确定是否需要采用不同的方法。apollo-server 文档声明使用 bodyParserConfig 选项,所以我想知道我是否没有正确格式化配置。

有什么简单的我做错了吗?另外我如何查看限制是多少?很难调试并查看我设置的选项是否真的在做任何事情。

谢谢

express body-parser apollo-server

6
推荐指数
1
解决办法
655
查看次数