错误:大多数中间件(如 bodyParser)不再与 Express 捆绑

Posted

技术标签:

【中文标题】错误:大多数中间件(如 bodyParser)不再与 Express 捆绑【英文标题】:Error: Most middleware (like bodyParser) is no longer bundled with Express 【发布时间】:2014-10-22 10:26:25 【问题描述】:

我需要创建一个 Web 服务,并且我在服务器中使用 Node.js。但是当我在 localhost 中运行时出现错误:

在一起,必须单独安装。请看https://github.com/senchalabs/connect#middleware.

neo4jtest.js

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

var app = express();

var neo4jurl = process.env.NEO4J_URL ;
neo4jurl = neo4jurl +'/db/data/';

var query = [ 'START me=node:node_auto_index(name=inputusername) MATCH me<--friend<--friend_of_friend where (friend_of_friend.entitytype=inputentitytype) RETURN friend_of_friend;' ];
var insertquery = [ 'CREATE (user entitytype:inputentitytype, name : inputname) return user;' ];
var queryforallrelation = [ 'start n = node:node_auto_index(name=inputusername) match(n)--(x)  return x;'];

// Config


    var env = process.env.NODE_ENV || 'development';
    if ('development' == env) 
    // configure stuff here
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);
    app.use(express.static(path.join(application_root, "public")));
    app.use(express.errorHandler( dumpExceptions: true, showStack: true ));
    

app.get('/api', function (req, res) 
  res.send('REST API is running');
);

app.get('/friendoffriend/:username', function (req, res)
    res.set('Content-Type': 'text/json');
    username = req.params.username;
    type = 'user';
    neo4j.connect(neo4jurl, function (err, graph) 

            graph.query(query.join('\n'), inputusername : username, inputentitytype :type ,function (err, results)   
                if (err) 
                    res.send(HTTPStatus.INTERNAL_SERVER_ERROR,'Internal Server Error');
                
                else 
                    res.send(HTTPStatus.OK,JSON.stringify(results));
                
            ); 
    );
);

app.get('/insertuser/:username', function (req, res)
    res.set('Content-Type': 'text/json');
    username = req.params.username;
    type = 'user';
    neo4j.connect(neo4jurl, function (err, graph) 
            graph.query(insertquery.join('\n'), inputname : username, inputentitytype :type ,function (err, results)     
                if (err) 
                    res.send(HTTPStatus.INTERNAL_SERVER_ERROR,'Internal Server Error');
                
                else 
                    res.send(HTTPStatus.OK,JSON.stringify(results));
                
            ); 
    );
);

//Cypher Query with javascript Callback Example

function neo4jQuery(neo4jurl, query, parameters, giveresults) 
    neo4j.connect(neo4jurl, function (err, graph) 
        graph.query(query.join('\n'), inputusername : 'andrew' ,function (err, results)  
            if (err) 
                giveresults(HTTPStatus.INTERNAL_SERVER_ERROR);
            
            else 
                giveresults(JSON.stringify(results));
            
        ); 
    );


app.get('/allrelations/:username', function (req, res)
    res.set('Content-Type': 'text/json');
    username = req.params.username;
    parameters = inputusername : username;
    neo4jQuery(neo4jurl, queryforallrelation, parameters, function(results)
        res.send(results);
    );
);



app.listen(1212);

以下是我从控制台得到的错误:

C:\node\NodejsNeo4j1-master>node neo4jtest.js 在一起,必须单独安装。请参阅 https://github.com/senchalabs/connect#middleware。 在 Function.Object.defineProperty.get (C:\node\NodejsNeo4j1-master\node_modules\express\lib\express.js:89:13) 在 Object. (C:\node\NodejsNeo4j1-master\neo4jtest.js:26:18) 在 Module._compile (module.js:456:26) 在 Object.Module._extensions..js (module.js:474:10) 在 Module.load (module.js:356:32) 在 Function.Module._load (module.js:312:12) 在 Function.Module.runMain (module.js:497:10) 启动时 (node.js:119:16) 在 node.js:906:3

【问题讨论】:

【参考方案1】:

您需要通过 npm 单独安装正文解析器:

    在您的项目根目录中:

    npm install body-parser

https://www.npmjs.org/package/body-parser

https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x

【讨论】:

我已经安装了body parser的依赖 bluedev:我检查过的两个网站。【参考方案2】:

您需要用外部/单独的中间件替换旧的捆绑中间件使用(express.bodyParserexpress.methodOverrideexpress.errorHandler)。错误中的链接为您提供了这些新中间件的名称。您可能需要查看这些中间件的文档,以检查自 Express 3 以来的任何 API 更改。

【讨论】:

谢谢!!!先生,如何更换旧的捆绑中间件?请告诉我步骤。【参考方案3】:

我遇到了类似的问题,但还没有解决。

但根据我的阅读,您需要从各种来源:

    要么更新你的 package.json 以包含所有中间件的依赖项,例如:

     “依赖”:
                       “表示”: ”*”,
                       “正文解析器”:“*”,
                       “方法覆盖”:“*”,
                      .
                      .
                      .
                     

    或者你可以在命令提示符下单独运行每一个

    npm install body-parser --save-dev

    您必须为您在here 显示的短列表或here 的完整列表中使用的中间件执行此操作。

    据我所知,在您的代码中,您使用的是:body-parser、method-override、static 和 errorhandler。

    您必须删除该行:

     app.use(app.router); 
    如here 所述

正如我所说,我也在努力。我建议您进行更改,并告诉我控制台上的错误是否更改。

【讨论】:

【参考方案4】:

编辑:我发布了布赖恩种子的一个分支,所有更改如下: https://github.com/LossyHorizon/angular-socket-io-seed

我在与自己作斗争时发现了这个讨论。在开始新项目之前,我正在更新我的https://github.com/btford/angular-socket-io-seed 副本。当我弄清楚如何做时,我计划将我的更改提交给 Brian Ford。

旧包.json

    "socket.io": "~0.9.16",
    "jade": "~0.31.2",
    "express": "~3.2.6"

新包.json

    "socket.io": "1.1.*",
    "jade": "1.6.*",
    "express": "4.8.*",
    "serve-favicon": "2",
    "morgan": "1.3.*",
    "method-override":"*", //added missing ,
    "body-parser": "1.8",
    "errorhandler": "*",
    "express-session": "*",
    "multer": "0.1.*"

您将需要显式添加曾经存在的中间件,一行:

    var express = require('express');

变成一堆行:

    var express = require('express');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var methodOverride = require('method-override');
    var session = require('express-session');
    var bodyParser = require('body-parser');
    var multer = require('multer');
    var errorHandler = require('errorhandler');

旧设置代码:

    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(app.router);

新的设置代码:

    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(favicon(__dirname + '/public/favicon.ico'));
    app.use(logger('dev'));
    app.use(methodOverride());
    app.use(session( resave: true, saveUninitialized: true, 
                      secret: 'uwotm8' ));

    // parse application/json
    app.use(bodyParser.json());                        

    // parse application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded( extended: true ));

    // parse multipart/form-data
    app.use(multer());

    app.use(express.static(path.join(__dirname, 'public')));

这是让我终生难忘的部分。可悲的是,一旦我解决了这个问题,我查看了 express/lib/application.js,搜索了 app.listen,并且有一个很棒的评论很好地解释了事情。不知道为什么我查找源代码的速度如此之慢,尽管看起来我并不孤单。

演示、文档、大多数博客文章都说你用这个来启动你的应用程序,它可以工作,但会阻止我们使用 socket.io(同时也是 http 和 https)。

    app.listen(app.get('port'), function()
       console.log('Express server on port ' + app.get('port'));
    );

这在功能上是相同的,但使 socket.io 的使用变得容易。查找 app.listen() 的源代码,您会发现无论如何它都是这样做的。

    // could be/remain at top of file
    var http = require('http');    

    var server = http.createServer (app);
    // delete this line if NOT using socket.io
    var io = require('socket.io').listen(server);   

    server.listen(app.get('port'), function()
       console.log('Express server on port ' + app.get('port'));
    );

不管你是使用新的 express 'standard' 语法还是这种语法,都可以使用相同的 http 对象,而且我记得 http 是 node.js 的内置组件。

我希望这对其他人有帮助。

【讨论】:

【参考方案5】:

首先你安装 bodyParser :

npm install body-parser

并使用它:

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

【讨论】:

如果你想更新你的 package.json : npm install body-parser --save

以上是关于错误:大多数中间件(如 bodyParser)不再与 Express 捆绑的主要内容,如果未能解决你的问题,请参考以下文章

bodyParser中间件的研究

Node.js 表达了对 bodyParser 中间件的正确使用

Node.js 表达了对 bodyParser 中间件的正确使用

如何在中间件中将 bodyParser 上传限制设置为特定路由而不是全局?

koa post 提交数据 koa-bodyparser 中间件的使用

服务端获取参数(koa)