我正在使用express 4.0,我知道主体解析器已经从express核心中取出,我正在使用推荐的替换,但我正在获得

bodyParser:使用单独的json/urlencoded中间件server.js:15:12 对扩展解析显式指定"extended: true" node_modules/ Body-parser /index.js:74:29

我在哪里可以找到这些所谓的中间件?或者我不应该得到这个错误?

var express     = require('express');
var server      = express();
var bodyParser  = require('body-parser');
var mongoose    = require('mongoose');
var passport    = require('./config/passport');
var routes      = require('./routes');

mongoose.connect('mongodb://localhost/myapp', function(err) {
    if(err) throw err;
});

server.set('view engine', 'jade');
server.set('views', __dirname + '/views');

server.use(bodyParser()); 
server.use(passport.initialize());

// Application Level Routes
routes(server, passport);

server.use(express.static(__dirname + '/public'));

server.listen(3000);

当前回答

就连我也面临着同样的问题。下面我提到的更改解决了我的问题。

如果您使用的是Express 4.16+版本,那么

您可能在代码中添加了如下所示的一行:

app.use (bodyparser.json ());//使用body-parser包

现在你可以用以下语句替换上面的代码行:

app.use (express.json ());//用于解析JSON主体

因为express.json()中的代码是基于bodyparser.json()的,所以这不会在应用程序中引入任何破坏性的更改。

如果你的环境中也有以下代码:

app.use (bodyParser。urlencoded({扩展:真}));

你可以将上面的代码行替换为:

app.use (express.urlencoded ());//解析url编码的主体

如果你得到一个警告,说你仍然需要将extended传递给express.urlencoded(),那么,将上面的代码更新为:

app.use(表达。Urlencoded ({extended: true}));

最后提醒一句:

如果您使用的是Express 4.16+,则可能不需要在应用程序中安装附加的主体解析器包。有许多教程包含了体解析器的安装,因为它们的年代早于Express 4.16的发布。

其他回答

我是在加法的时候发现的

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

有帮助,有时取决于您的查询决定express如何处理它。

例如,可能是在URL中传递参数,而不是在正文中传递参数

在这种情况下,您需要捕获正文参数和url参数,并使用任何可用的参数(在下面的情况中优先使用正文参数)

app.route('/echo')
    .all((req,res)=>{
        let pars = (Object.keys(req.body).length > 0)?req.body:req.query;
        res.send(pars);
    });

在旧版本的express中,我们必须使用:

app.use(express.bodyparser()); 

因为体解析器是节点和 表达。现在我们必须像这样使用它:

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

而不是bodyParser.json(),只需使用express.json(), 您不想安装主体解析器

举个例子,

const express = require("express");

const app = express();
app.use(express.json());

在我的情况下,它是typescript + vs code错误地标记为已弃用:

但是如果你检查源代码:

/** @deprecated */
declare function bodyParser(
    options?: bodyParser.OptionsJson & bodyParser.OptionsText & bodyParser.OptionsUrlencoded,
): NextHandleFunction;

declare namespace bodyParser {

您可以看到,它应该是构造函数,而不是名称空间。 所以不是typescript就是vs code弄错了。 一切都很好,在这种情况下没有发生弃用(bodyParser as namespace=

就连我也面临着同样的问题。下面我提到的更改解决了我的问题。

如果您使用的是Express 4.16+版本,那么

您可能在代码中添加了如下所示的一行:

app.use (bodyparser.json ());//使用body-parser包

现在你可以用以下语句替换上面的代码行:

app.use (express.json ());//用于解析JSON主体

因为express.json()中的代码是基于bodyparser.json()的,所以这不会在应用程序中引入任何破坏性的更改。

如果你的环境中也有以下代码:

app.use (bodyParser。urlencoded({扩展:真}));

你可以将上面的代码行替换为:

app.use (express.urlencoded ());//解析url编码的主体

如果你得到一个警告,说你仍然需要将extended传递给express.urlencoded(),那么,将上面的代码更新为:

app.use(表达。Urlencoded ({extended: true}));

最后提醒一句:

如果您使用的是Express 4.16+,则可能不需要在应用程序中安装附加的主体解析器包。有许多教程包含了体解析器的安装,因为它们的年代早于Express 4.16的发布。