node.js-错误:大多数中间件(如bodyParser)不再与Express捆绑在一起

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

错误:大多数中间件(如bodyParser)不再与Express捆绑在一起,必须单独安装。 请参阅[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

Error: Most middleware (like bodyParser) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.
    at Function.Object.defineProperty.get (C:\node\NodejsNeo4j1-master\node_modules\express\lib\express.js:89:13)
    at Object.<anonymous> (C:\node\NodejsNeo4j1-master\neo4jtest.js:26:18)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3
mscdex asked 2020-07-12T10:54:45Z
5个解决方案
57 votes

编辑:我发布了Brian的种子的叉子,下面给出了所有更改:[https://github.com/LossyHorizon/angular-socket-io-seed]

我在与自己抗争的同时找到了讨论。 我正在更新我的副本
在开始新项目之前,请先[https://github.com/btford/angular-socket-io-seed]。 当我知道如何更改后,我计划将更改提交给Brian Ford。

OLD package.json

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

新的package.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'));
    });

不管您使用的是新的表达“标准”语法,还是此语法,无论哪种方式都使用相同的http对象,而且正如我记得的那样,http是node.js的内置组件。

我希望这可以帮助其他人。

James Powell answered 2020-07-12T10:56:12Z
10 votes
  • 首先,您安装bodyParser:

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

  • 并使用它:

    var bodyParser = require('body-parser'); 
    app.use(bodyParser.urlencoded({
        extended: true
    }));
    app.use(bodyParser.json());
    
Shinichi-kudo answered 2020-07-12T10:56:37Z
6 votes

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

mscdex answered 2020-07-12T10:54:54Z
4 votes

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

  1. 在您的项目根目录中:

    npm install body-parser

看到

[HTTPS://呜呜呜.那匹马加上.org/package/body-parser]

[HTTPS://GitHub.com/strong loop/express/wiki/migrating-from-3.小-to-4.小]

answered 2020-07-12T10:57:14Z
1 votes

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

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

  1. 更新您的package.json以包括所有中间件的依赖项,例如:

    “依赖关系”:{                    “表达”: ”*”,                    “ body-parser”:“ *”,                    “ method-override”:“ *”,                   。                   。                   。                 }

    或者您可以在命令提示符下分别运行每个

    npm install body-parser --save-dev

    对于此处显示的简短列表或此处的完整列表中使用的中间件,您将必须执行此操作。

    据我所知,在您的代码中,您正在使用:正文解析器,方法重写,静态和错误处理程序。

  2. 您将必须删除以下行:

    app.use(app.router);
    如此处所述

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

Chintan Pathak answered 2020-07-12T10:58:23Z
translate from https://stackoverflow.com:/questions/25550819/error-most-middleware-like-bodyparser-is-no-longer-bundled-with-express