我正在研究在服务器端使用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和表达框架的基础知识.我有一个带有两个按钮的简单页面:
<form action="/home2" method="post">
<button name="butt1">butt1</button>
<button name="butt2">butt2</button>
</form>
Run Code Online (Sandbox Code Playgroud)
我想在控制台中看到按下了哪个按钮:
router.post('/', function(req, res, next) {
console.log(req.body.name);
res.render('home2', { title: 'post' });
});
Run Code Online (Sandbox Code Playgroud)
在我刚刚看到的控制台中
undefined
Run Code Online (Sandbox Code Playgroud)
如何访问按钮的名称?
我正在使用ExpressJS框架来创建REST API.所有API都应该只接受POST,PUT和PATCH类型的请求方法的JSON请求体.
我正在使用express.bodyParser模块来解析JSON主体.它工作得很好.
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
Run Code Online (Sandbox Code Playgroud)
如果我的JSON正文中有任何语法错误,我的上一个错误处理程序中间件被完美地调用,我可以自定义响应400 Bad Request.
但是,如果我传递内容类型而不是application/json类似的东西(text/plain,text/xml,application/xml),那么正文解析器模块会在没有错误的情况下解析它,并且在这种情况下不会调用我的错误处理程序中间件.
我的上一个错误处理程序中间件
export default function(error, request, response, next) {
if(error.name == 'SyntaxError') {
response.status(400);
response.json({
status: 400,
message: "Bad Request!"
});
}
next();
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是在内容类型不是的情况下调用我的最后一个错误处理程序applicaition/json.
我正在写一个实现用户管理系统的网站,我想知道我必须考虑哪些关于表单处理的最佳实践.
特别是性能,安全性,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) 我使用邮递员向我的服务器发送以下请求:
我尝试使用以下代码访问应用程序中的图像:
应用程序.js
var express = require('express');
var bodyParser = require('body-parser');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
app.use(bodyParser.raw({
type: 'image/png',
limit: '10mb'
}));
app.use('/', indexRouter);
app.use('/users', usersRouter);
module.exports = app;
Run Code Online (Sandbox Code Playgroud)
index.js(路由器)
var express = require('express');
const router = express.Router();
var Jimp = require('jimp');
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
router.post('/a', function(req, res) {
var image = req.body;
try{
Jimp.read(image, (err, input) => {
if (err) …Run Code Online (Sandbox Code Playgroud) 我正在向后端使用一个简单的发布请求来获取表单数据,并且由于某种原因,正文始终为空。我试图隔离这个问题,所以我将内容类型更改为应用程序 json,并将数据更改为 json,只有这样我才能发送数据。
客户端:
submitForm(event) {
event.preventDefault();
console.log("gggg");
const data = new FormData(event.target);
axios.post("http://localhost:4000/user-form-post",data).then(function (response) {
//handle success
console.log(response);
})
.catch(function (response) {
//handle error
console.log(response);
});
Run Code Online (Sandbox Code Playgroud)
服务器端:
// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({extended:true}));
app.use(express.urlencoded());
// Parse JSON bodies (as sent by API clients)
app.use(express.json());
app.use(logger('dev'));
app.post('/user-form-post', (req,res) =>{
console.log("dfdf");
console.log(req.body); // alwayes print empty dict {}
res.end();
})
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它需要 jsons(预期行为):
// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({extended:true}));
Run Code Online (Sandbox Code Playgroud)
与邮差的行为相同。
我编写了一个 Express 中间件来从请求中检索原始正文,并将其设置在正文解析器中间件之前。
我的自定义中间件正在调用req.setEncoding('utf8'),但这会导致以下正文解析器错误:
错误:不应设置流编码
Run Code Online (Sandbox Code Playgroud)at readStream (/node_modules/body-parser/node_modules/raw-body/index.js:211:17) at getRawBody (/node_modules/body-parser/node_modules/raw-body/index.js:106:12) at read (/node_modules/body-parser/lib/read.js:76:3) at jsonParser (/node_modules/body-parser/lib/types/json.js:127:5)
这是我的代码:
var express = require('express');
var bodyParser = require('body-parser')
function myMiddleware() {
return function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
}
}
var app = express();
app.use(myMiddleware());
app.use(bodyParser.json());
var listener = app.listen(3000, function() {
});
app.get('/webhook/', function (req, res) {
res.sendStatus(200);
});
Run Code Online (Sandbox Code Playgroud)
有没有办法取消编码?是否有另一种方法来检索原始正文,但在它之后仍然使用正文解析器?
我正在尝试使用以下代码通过我的网络应用程序上传文件。
看法:
<form name="uploadForm" class="form-horizontal col-sm-12">
<div class="col-sm-4">
<input type="file" ng-model="rsdCtrl.viewData.file" name="file"/>
</div>
<div class="col-sm-4">
<button class="btn btn-success" type="submit" ng-click="uploadFile()">Upload</button>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
控制器:
function uploadFile(){
if (uploadForm.file.$valid && file) {
return uploadService.upload(vd.file, "Convictions Calculator", "PCCS").then(function(response){
/* Some stuff */
}).catch(handleServiceError);
}
}
Run Code Online (Sandbox Code Playgroud)
上传服务:
(function (){
'use strict';
angular.module('cica.common').service('uploadService', ['$http', '$routeParams', uploadService]);
function uploadService($http, $routeParams) {
this.upload = function (file, name, type) {
const fd = new FormData();
fd.append('document', file);
fd.append('jobId', $routeParams.jobId);
fd.append('documentRename', name);
fd.append('documentType', type);
return $http.post('/document/upload', fd, {
transformRequest: …Run Code Online (Sandbox Code Playgroud) 我在使用 Node.js 中的注册表单发布帖子时遇到问题。每次发布表单时,请求的正文都有信息,但正文是空的。我对节点和表达很陌生,所以这可能是小事,但我一生都无法弄清楚。
这是我在 ejs 中的表单:
<form class="form-signin" method="post" action="/users/register">
<div class="form-group">
<label class="sr-only" for="email">Email address</label>
<input type="email" class="form-control" id="email" placeholder="Enter Email" autocomplete="off">
</div>
<div class="form-group">
<label class="sr-only" for="password">Password</label>
<input type="password" class="form-control" id="password" placeholder="Enter Password">
</div>
<div class="form-group">
<label class="sr-only" for="confirmPassword">Confirm Password</label>
<input type="password" class="form-control" id="confirmPassword" placeholder="Re-enter Password">
</div>
<button class="btn btn-dark mt-3" type="submit">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)
这是我在用户路由器中的路由器代码:
router.post('/register', function(request, response, next) {
console.log(request);
console.log(request.body)
response.render('register', { 'title': 'Register' });
});
Run Code Online (Sandbox Code Playgroud)
这是控制台上的相关输出:
console.log(request); output shortened this is just the tail.
_startAt: [ …Run Code Online (Sandbox Code Playgroud) 我想做以下事情:当用户上传带有表单字段的文件时,检查表单字段是否为空,如果是,则不上传文件。我正在使用这个代码
fileFilter: (req,file,callback) =>{
if(req.body.name.trim().length < 1){
callback(null, false)
}
}
Run Code Online (Sandbox Code Playgroud)
但它给了我未定义的 req.body.name 并且据我所知 fileFilter 将 Express.Request 作为第一个参数,那么为什么我无法访问正文?
完全错误
类型错误:无法读取未定义的属性“trim”
谢谢!