【问题标题】:Extracting POST parameters from request in Nodejs从Nodejs中的请求中提取POST参数
【发布时间】:2014-06-08 15:30:19
【问题描述】:

我正在尝试通过使用请求从变量 postData 中的 POST 获取参数 - (我之所以使用它,是因为这里有人建议它 - How do I get the post request with express js?

这里—— How to retrieve POST query parameters?

var express = require('express');
var app = express();
var fs = require('fs');
var json = require('json');
app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

app.post('/shrib/:file/:data',function(req,res){
    var fileName = req.params.file;
    var data = req.params.data;
    req.on('data',function(data){ body+=data; } );
    req.on('end' ,function(){
        var postData = qs.parse(body);
        var writeStream = fs.createWriteStream(fileName);
        var postData = req.body.text;
        if(postData)
            console.log(postData);
        else    
            console.log("failed miserably");
        res.write(200);
        res.end();
    });
});
app.get('/shrib/:file',function(req,res){   
    var fileName = req.params.file;
    if(fileName != ''){
        var readStream = fs.createReadStream(fileName);
        var content;
        readStream.on('data',function(chunk){
            content+=chunk.toString();
            console.log(content);
        });
        readStream.on('end',function(){
            res.writeHead(200,{"Content-Type":"text/html"});
            res.write("<form id=\"submitForm\" method=\"POST\">");
            res.write("<textarea id=\"text\"rows=50 cols=50 >");
            console.log(content);
            if(content)
                res.write(content.toString());
            res.write("</textarea>");
            res.write("<input type=\"submit\" value=\"submit\" />");
            res.write("</form>");
            res.write("<script>");
            res.write("var windowLocation = location.href;");
            res.write("document.getElementById(\"submitForm\").action=windowLocation + \'/data\';");
            res.write("</script>");
            res.end();
        });
    }else{
        res.writeHead(200);
        res.write("invalid/empty path name"); 
    }
});
app.listen(8080);

得到了这个错误 -

Error: Most middleware (like json) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.
    at Function.Object.defineProperty.get (/home/unknown/public_html/node/node_modules/express/lib/express.js:89:13)

我使用的是正文解析器,之前我在这里阅读了一些解决方案,它给了我同样的错误中间件丢失,我在全局安装它然后也得到了同样的错误,之后我读到了 json,所以我使用全局安装它

npm install -g json

也没有工作。然后我尝试添加依赖项 -

{
  "name": "express_shrib.js",
  "version": "0.0.1",
  "description": "Creating Shrib Using Express",
  "main": "express_shrib.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/iamdeadman/nodejs.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/iamdeadman/nodejs/issues"
  },
  "homepage": "https://github.com/iamdeadman/nodejs",
  "dependencies": {
    "express": ">= 1.2.0",
    "json": ">= 9.0.0"
  }
}

然后运行 ​​npm install 还是一样的错误 -

Error: Most middleware (like json) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.
    at Function.Object.defineProperty.get (/home/unknown/public_html/node/node_modules/express/lib/express.js:89:13)

编辑** - 使用新的正文解析器模块编写代码

var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require('body-parser');
app.use(bodyParser());
app.post('/shrib/:file/:data',function(req,res){
    var fileName = req.params.file;
    var data = req.params.data;
    req.on('data',function(data){ body+=data; } );
    req.on('end' ,function(){
        var postData = req.body;
        var writeStream = fs.createWriteStream(fileName);
        if(postData)
            console.log(postData);
        else{   
            console.log("failed miserably");
            console.log(postData);
        }
        res.writeHead(200);
        res.end();
    });
});
app.get('/shrib/:file',function(req,res){   
    var fileName = req.params.file;
    if(fileName != ''){
        var readStream = fs.createReadStream(fileName);
        var content;
        readStream.on('data',function(chunk){
            content+=chunk.toString();
            console.log(content);
        });
        readStream.on('end',function(){
            res.writeHead(200,{"Content-Type":"text/html"});
            res.write("<form id=\"submitForm\" method=\"POST\">");
            res.write("<textarea id=\"text\"rows=50 cols=50 >");
            console.log(content);
            if(content)
                res.write(content.toString());
            res.write("</textarea>");
            res.write("<input type=\"submit\" value=\"submit\" />");
            res.write("</form>");
            res.write("<script>");
            res.write("var windowLocation = location.href;");
            res.write("document.getElementById(\"submitForm\").action=windowLocation + \'/data\';");
            res.write("</script>");
            res.end();
        });
    }else{
        res.writeHead(200);
        res.write("invalid/empty path name"); 
    }
});
app.listen(8080);

在这里我得到了

{}

在控制台中,这意味着 body 对象由于某种原因是空的。

【问题讨论】:

    标签: javascript node.js express http-post


    【解决方案1】:

    在 Express 4 中,body 解析中间件(与其他以前内置的中间件一样)被提取到“body-parser”模块中。但是,这个新模块只处理 JSON 和 urlencoded 表单提交,而不是 multipart。

    如果您需要多部分支持,则需要使用 connect-busboymulterconnect-multiparty 之类的东西(connect-multiparty 本质上是旧的 Express bodyParser 中间件)。

    编辑:另外,textarea 输入字段缺少name 属性。这是必需的,否则该字段将不会与表单一起发送。

    【讨论】:

    • 好的,所以我添加了 npm install body-parser -g 然后 app.use(bodyParser());然后尝试 var postData = req.body.text; console.log(postData);
    • 但它仍然在 console.log() 中给了我 undefined
    • 好的,在打印 req.body 时,我得到了 {},你能建议为什么 text id 中的数据没有被发布
    • 您可能应该将您现在使用的代码与body-parser 一起发布在某处。
    • 我为body-parser代码编辑了我的帖子,我从expressjs.com/guide.html#error-handlinggithub.com/expressjs/body-parser找到了虽然我不明白为什么要在使用函数中包装解析代码,有必要吗?或者我做的方式是正确的,但我在回复中发布的表格是错误的
    【解决方案2】:

    使用 express 4 时,使用 body-parser 中间件获取参数。 Multipart 存在创建大量临时文件的问题。所以最好尽量避免,直接使用上传服务。

    app.use(function (req, res, next) {
            var urlParser = require('url');
            var url = urlParser.parse(req.url, true);
            if (url.pathname == "/rest/file/upload") {
                next();
            } else {
                var contentType = req.header("content-type");
                if (contentType && contentType.indexOf("application/json") != -1) {
                    bodyParser.json({limit: 1024 * 1024 * 10})(req, res, next);
                } else {
                    bodyParser.urlencoded({ extended: true, limit: 1024 * 1024 * 10})(req, res, next);
                }
            }
        });
    

    然后将您的请求参数设置为:

    console.log(req.param("parameter-name"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-02
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2020-04-06
      相关资源
      最近更新 更多