如何检索POST查询参数?

2020/09/21 01:31 · javascript ·  · 0评论

这是我的简单表格:

<form id="loginformA" action="userlogin" method="post">
    <div>
        <label for="email">Email: </label>
        <input type="text" id="email" name="email"></input>
    </div>
<input type="submit" value="Submit"></input>
</form>

这是我的Express.js /Node.js代码:

app.post('/userlogin', function(sReq, sRes){    
    var email = sReq.query.email.;   
}

我试过sReq.query.emailsReq.query['email']sReq.params['email'],等等。它们都不起作用。他们都回来了undefined

当我更改为Get呼叫时,它可以工作,所以..有什么想法吗?

事情已经改变了再次启动快速4.16.0,您现在可以使用express.json()express.urlencoded()就像在快车3.0

Express 4.0到4.15,这是不同的

$ npm install --save body-parser

然后:

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

其余的就像在Express 3.0中一样

首先,您需要添加一些中间件来解析正文的发布数据。

添加以下两行代码之一或全部:

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

然后,在处理程序中,使用req.body对象:

// assuming POST: name=foo&color=red            <-- URL encoding
//
// or       POST: {"name":"foo","color":"red"}  <-- JSON encoding

app.post('/test-page', function(req, res) {
    var name = req.body.name,
        color = req.body.color;
    // ...
});

请注意,express.bodyParser()不建议使用。

app.use(express.bodyParser());

...相当于:

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());

存在与安全性有关的问题express.multipart(),因此最好为所需的特定编码类型显式添加支持。如果您确实需要分段编码(例如,以支持上传文件),则应阅读

使用express.bodyParser()的安全问题

而所有其他的答案目前推荐使用的express.bodyParser()中间件,这其实是围绕着一个包装express.json()express.urlencoded()express.multipart()中间件(http://expressjs.com/api.html#bodyParser)。表单请求主体的解析是由express.urlencoded()中间件完成的,而这是将req.body对象上的表单数据公开所需要的全部

由于出于安全考虑,如何express.multipart()/ connect.multipart()为所有上载的文件创建临时文件(并且不会进行垃圾回收),因此建议不要使用express.bodyParser()包装器,而只使用所需的中间件。

注意:connect.bodyParser()将很快更新为仅包含urlencodedjson发布Connect 3.0(Express进行了扩展)。


简而言之,而不是...

app.use(express.bodyParser());

...您应该使用

app.use(express.urlencoded());
app.use(express.json());      // if needed

并且如果/当您需要处理多部分表单(文件上传)时,请使用第三方库或中间件,例如多方,busboy,dicer等。

注意:此答案适用于Express2。有关Express 3,请参见此处

如果您使用的是connect / express,则应使用bodyParser中间件Expressjs指南对此进行了说明

// example using express.js:
var express = require('express')
  , app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
  var email = req.param('email', null);  // second parameter is default
});

这是原始的仅连接版本:

// example using just connect
var connect = require('connect');
var url = require('url');
var qs = require('qs');
var server = connect(
  connect.bodyParser(),
  connect.router(function(app) {
    app.post('/userlogin', function(req, res) {
      // the bodyParser puts the parsed request in req.body.
      var parsedUrl = qs.parse(url.parse(req.url).query);
      var email = parsedUrl.email || req.body.email;;
    });
  })
);

querystring和body均使用Rails样式的参数处理(qs而不是低级querystring进行解析为了使用解析重复的参数qs,该参数必须带有方括号:name[]=val1&name[]=val2它还支持嵌套地图。除了解析HTML表单提交,bodyParser还可以自动解析JSON请求。

编辑:我阅读了express.js并修改了答案,以使Express用户更加自然。

如果您要构建不带中间件的发布查询,则将执行此操作:

app.post("/register/",function(req,res){
    var bodyStr = '';
    req.on("data",function(chunk){
        bodyStr += chunk.toString();
    });
    req.on("end",function(){
        res.send(bodyStr);
    });

});

这会将其发送到浏览器

email=emailval&password1=pass1val&password2=pass2val

虽然使用中间件可能更好,但是您不必在每条路线中都一遍又一遍地编写。

Express 4用户注意事项:

如果尝试放入app.use(express.bodyParser());应用程序中,则尝试启动Express服务器时将出现以下错误:

错误:大多数中间件(如bodyParser)不再与Express捆绑在一起,必须单独安装。请参阅https://github.com/senchalabs/connect#middleware

您必须将软件包body-parsernpm分开安装,然后使用类似以下的内容(示例来自GitHub页面):

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

var app = express();

app.use(bodyParser());

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next();
})

给定某种形式:

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>

使用快递

app.post('/somepath', function(req, res) {

    console.log(JSON.stringify(req.body));

    console.log('req.body.name', req.body['name']);
});

输出:

{"name":"x","description":"x"}
req.param.name x

后端:

import express from 'express';
import bodyParser from 'body-parser';

const app = express();
app.use(bodyParser.json()); // add a middleware (so that express can parse request.body's json)

app.post('/api/courses', (request, response) => {
  response.json(request.body);
});

前端:

fetch("/api/courses", {
  method: 'POST',
  body: JSON.stringify({ hi: 'hello' }), // convert Js object to a string
  headers: new Headers({ "Content-Type": "application/json" }) // add headers
});
app.use(express.bodyParser());

然后,app.post如果需要您可以通过获取帖子值req.body.{post request variable}

Express 4.4.1的更新

以下中间件已从Express中删除。

  • bodyParser
  • json
  • urlencoded
  • 多部分

当您像在express 3.0中一样直接使用中间件时。您将收到以下错误:

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.


为了利用这些中间件,现在您需要
分别为每个中间件执行
npm

由于bodyParser被标记为已弃用,因此我建议使用json,urlencode和multipar解析器(如强大,connect-multiparty)的以下方式。(不建议使用多部分中间件)。

还要记住,仅定义urlencode + json,就不会解析表单数据,并且req.body将是未定义的。您需要定义一个中间件处理多部分请求。

var urlencode = require('urlencode');
var json = require('json-middleware');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

app.use(json);
app.use(urlencode);
app.use('/url/that/accepts/form-data', multipartMiddleware);

对于Express 4.1及更高版本

由于大多数答案都用于Express,bodyParser,connect;不建议使用multipart的地方。有一种安全的方法可以轻松发送后期多部分对象。

Multer可以替代connect.multipart()。

要安装软件包

$ npm install multer

将其加载到您的应用中:

var multer = require('multer');

然后,将其与其他解析中间件的表单一起添加到中间件堆栈中。

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));

connect.json()处理application / json

connect.urlencoded()处理应用程序/ x-www-form-urlencoded

multer()处理多部分/表单数据

我正在寻找这个确切的问题。我遵循了以上所有建议,但req.body仍返回空对象{}。就我而言,这就像html不正确一样简单。

在表单的html中,请确保'name'在输入标签中使用属性,而不仅仅是使用'id'否则,将不解析任何内容。

<input id='foo' type='text' value='1'/>             // req = {}
<input id='foo' type='text' name='foo' value='1' /> // req = {foo:1}

我的白痴错误是您的利益。

您不应该使用app.use(express.bodyParser())BodyParser是json + urlencoded + mulitpart的并集。您不应该使用此功能,因为在connect 3.0中将删除多部分。

要解决此问题,您可以执行以下操作:

app.use(express.json());
app.use(express.urlencoded());

知道应该在json和urlencode之后使用app.use(app.router),这是非常重要的,否则它将不起作用!

请求流式传输对我有用

req.on('end', function() {
    var paramstring = postdata.split("&");
});

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});

通过对POSTGET请求使用以下代码,我可以找到所有参数

var express = require('express');
var app = express();
const util = require('util');
app.post('/', function (req, res) {
    console.log("Got a POST request for the homepage");
    res.send(util.inspect(req.query,false,null));
})

写在Express版本4.16

在router函数内部,您可以使用req.body属性访问post变量。例如,如果这是POST您的表单路线,它将发送回您输入的内容:

function(req,res){
      res.send(req.body);

      //req.body.email would correspond with the HTML <input name="email"/>
}

适用于那些熟悉PHP的人的PS:为了访问$_GET我们使用的PHP 变量req.query以及访问$_POST我们req.body在Node.js中使用的PHP 变量

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

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get('/',function(req,res){
  res.sendfile("index.html");
});
app.post('/login',function(req,res){
  var user_name=req.body.user;
  var password=req.body.password;
  console.log("User name = "+user_name+", password is "+password);
  res.end("yes");
});
app.listen(3000,function(){
  console.log("Started on PORT 3000");
})

可以按以下方式检索发布参数:

app.post('/api/v1/test',Testfunction);
http.createServer(app).listen(port, function(){
    console.log("Express server listening on port " + port)
});

function Testfunction(request,response,next) {
   console.log(request.param("val1"));
   response.send('HI');
}

您正在使用req.query.post与错误的方法req.query.post作品有method=getmethod=post用作品身体解析器

只需通过改变试试这个岗位,以获得

<form id="loginformA" action="userlogin" method="get">
<div>
    <label for="email">Email: </label>
    <input type="text" id="email" name="email"></input>
</div>
<input type="submit" value="Submit"></input>  
</form>

在快速代码中使用“ app.get”

使用express-fileupload软件包:

var app = require('express')();
var http = require('http').Server(app);
const fileUpload = require('express-fileupload')

app.use(fileUpload());

app.post('/', function(req, res) {
  var email = req.body.email;
  res.send('<h1>Email :</h1> '+email);
});

http.listen(3000, function(){
  console.log('Running Port:3000');
});

当您以HTML形式使用POST方法时,您需要从服务器端req.body(即Node.js)中捕获数据。并添加

var bodyParser = require('body-parser')
app.use( bodyParser.json() );    
app.use(bodyParser.urlencoded({extended: false}));

要么

在HTML中使用method ='GET'并通过服务器端的req.query捕获数据,即Node.js

来自官方文档版本4

const express = require('express')
const app = express()
app.use(express.json());
app.use(express.urlencoded({ extended: true })) 

app.post('/push/send', (request, response) => {
  console.log(request.body)
})
本文地址:http://javascript.askforanswer.com/ruhejiansuopostchaxuncanshu.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!