Ошибка: большинство промежуточных программ (например, bodyParser) больше не связаны с Express
Мне нужно создать веб-службу, и я использую Node.js на сервере. Но когда я запускаю в localhost, я получаю сообщение об ошибке:
Ошибка. Большинство промежуточных программ (например, 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
Ответы
Ответ 1
Вам нужно заменить прежнее связанное использование промежуточного программного обеспечения (express.bodyParser
, express.methodOverride
, express.errorHandler
) с помощью внешнего/отдельного промежуточного программного обеспечения. Ссылка в ошибке дает вам имена этих новых промежуточных программ. Вы можете проверить документацию для этого промежуточного программного обеспечения, чтобы проверить какие-либо изменения API с Express 3.
Ответ 2
ИЗМЕНИТЬ: Я отправил вилку семени Брайана со всеми изменениями, приведенными ниже:
https://github.com/LossyHorizon/angular-socket-io-seed
Я нашел это обсуждение, борясь с этим. Я обновляю свою копию
https://github.com/btford/angular-socket-io-seed, прежде чем я начну новый проект. Я планирую представить свои изменения обратно Брайану Форду, когда выясню, как.
OLD package.json
"socket.io": "~0.9.16",
"jade": "~0.31.2",
"express": "~3.2.6"
NEW 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 в любом случае.
Я надеюсь, что это поможет кому-то другому.
Ответ 3
Вам нужно установить парсер тела отдельно через 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
Ответ 4
Ответ 5
У меня такая же проблема, и я еще не смог ее решить.
Но согласно моему чтению, из разных источников вам нужно:
-
Обновите свой пакет .json, чтобы включить зависимости для всех промежуточных программ:
"dependencies": {
"express": "*",
"body-parser": "*",
"method-override": "*",
.
.
.
}
или вы можете просто запускать каждый отдельно в командной строке как
npm install body-parser --save-dev
Вам нужно будет сделать это для промежуточного программного обеспечения, которое вы используете из приведенного короткого списка здесь или полного списка здесь.
Насколько я могу понять, в вашем коде вы используете: body-parser, method-override, static и errorhandler.
-
Вам нужно будет удалить строку:
app.use(app.router);
, как описано здесь
Как я уже сказал, я также работаю над этим. Я предлагаю вам внести изменения и сказать, изменилась ли ошибка на консоли.