所以我在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.
任何想法如何获得请求的实际主体?
提前致谢.
我正在使用创建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) 在阅读了两者之后,我仍然无法理解它,可能是语言差异,但请帮助澄清。
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()
我知道这不是代码问题,但我提前感谢任何可以列出主要差异的人。
我已经阅读了所有可以找到的文档,但是我找不到这两个中间件的简单解释.
什么是body在body-parser指什么?为什么需要解析身体?
同样适用于cookies.我是否正确地cookie-parser"解析"或瘫痪网络用户附带的cookie?
最后,我读过body-parser在Express4中既不安全又不推荐使用.我应该不用吗?
我的节点应用程序使用快递,在我需要通过邮件消息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)
顺便说一下,这是有效的,但我想知道我是否正确使用它...
前几天我们在Rest API中添加了NewRelic,APM,它是用NodeJS编写的,使用EXPRESS JS作为开发框架。
由于 JSON 解析器中间件,现在我们看到很多用户体验到响应时间很短的情况。
如您所见,大部分时间都被中间件 JSON 解析器消耗。
我们在想问题可能来自大型 JSON 有效负载,有时是从 API 发出的。但是对于这个响应,如上所示,API 返回了 contentLength=598 的数据,这不应该是太大的 JSON。
我们还使用了在向下钻取的请求执行屏幕截图中可见的压缩中间件。这应该减少来回发送给客户端的 IO 的大小。
此时我们对初始化时传递给中间件的参数限制有疑问。{limit:50kb} 但是在本地测试时它没有任何区别。
我们在考虑用 protobuf 切换,还考虑了异步解析 JSON 负载的方式。因为中间件使用的 JSON.parse 是同步进程,停止非阻塞 IO。
但是在开始这些更改和实验之前,请如果有人遇到同样的问题,请提出任何可能的解决方案。
基准测试:
对于本地/阶段环境的基准测试,我们使用 JMeter 并生成负载来检查何时可能发生此类超时,但在使用 JMeter 进行测试时我们无法捕捉到这一点。
谢谢你。
我正在研究在服务器端使用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) 我正在写一个实现用户管理系统的网站,我想知道我必须考虑哪些关于表单处理的最佳实践.
特别是性能,安全性,SEO和用户体验对我来说非常重要.当我处理它时,我遇到了几个问题,我没有找到一个完整的节点/快速代码片段,在那里我可以找出我以下的所有问题.
使用案例:有人将更新其个人资料的生日.现在我正在对同一个URL执行POST请求以处理该页面上的表单,POST请求将使用302重定向到同一URL进行响应.
关于表单处理的一般问题:
表达有关表单处理的具体问题:
我假设在将任何内容插入我的数据库之前,我需要清理并验证服务器端的所有表单字段.你会怎么做?
我读了一些关于CSRF的事情,但我从未实施过CSRF保护.我也很高兴在代码片段中看到它
使用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) 我试图改变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) 我正在尝试使用 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 选项,所以我想知道我是否没有正确格式化配置。
有什么简单的我做错了吗?另外我如何查看限制是多少?很难调试并查看我设置的选项是否真的在做任何事情。
谢谢
body-parser ×10
express ×9
node.js ×9
javascript ×4
cookies ×1
json ×1
middleware ×1
newrelic ×1
parsing ×1
performance ×1
sails.js ×1
security ×1
urlencode ×1