ChatGPT解决这个技术问题 Extra ChatGPT

bodyParser 已弃用 express 4

我正在使用 express 4.0,并且我知道正文解析器已从 express 核心中取出,我正在使用推荐的替换,但是我得到了

body-parser deprecated bodyParser: use individual json/urlencoded middlewares server.js:15:12 body-parser deprecated urlencoded: explicitly specify "extended: true" for extended parsing 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);
请注意,对于未来的读者,OP 的脚本使用 var server = express(),但是在阅读(似乎是所有)下面的答案时,假设使用了行 var app = express()

B
Ben Fortune

这意味着截至 2014 年 6 月 19 日,使用 bodyParser() 构造函数 已为 deprecated

app.use(bodyParser()); //Now deprecated

您现在需要分别调用这些方法

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

等等。

如果您仍然收到 urlencoded 的警告,您需要使用

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

extended 配置对象键现在需要显式传递,因为它现在没有默认值。

如果您使用 Express >= 4.16.0,则在方法 express.json()express.urlencoded() 下重新添加了正文解析器。


@eslammostafa您可以使用bodyparser,只是不能调用构造函数。您需要调用每个单独的方法。
@BenFortune 谢谢本,我明白了,我只是担心 /tmp 的事情,但现在我再次检查,只有当我们使用 bodyParser 解析多部分表单时才会出现 /tmp 问题,andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html 我将使用强大的然后用于多部分表单.
extended 有什么作用?
我解释扩展 true 的最佳方式是不使用扩展意味着 curl --data "user[email]=foo&user[password]=bar" localhost:3000/login 将在 req.body 中作为 { user[email]: "foo", ...} 被服务器接收,而 req.body 将是 {user: {email: "foo", ... }}extended: true
bodyParser 本身现在被标记为已弃用,可作为 express 的一部分使用,请参阅 Sridhar 的回答 stackoverflow.com/a/59892173/196869express.json()
M
Muhammad Adeel

想要零警告?像这样使用它:

// Express v4.16.0 and higher
// --------------------------
const express = require('express');

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

// For Express version less than 4.16.0
// ------------------------------------
const bodyParser = require('body-parser');

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

说明extended 选项的默认值已被弃用,这意味着您需要显式传递 true 或 false 值。

Express 4.16.0 及更高版本的注意事项:已重新添加正文解析器以提供开箱即用的请求正文解析支持。


我使用它,仍然收到“body-parser deprecated”消息。 app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
没错,我在访问构造函数时收到了弃用警告。它作为依赖项包含在 Express 4.17 中):nodejs.dev/learn/get-http-request-body-data-using-nodejs
谢谢这项工作是给我的,但我有一个问题!那么,现在我们不需要安装 body-parser 了吗?
仍然在 express@4.17.1 弃用
使用 express 4.16+ body-parser 不再需要安装或使用,因此会出现弃用警告。 express no 直接包含json和urlencoded中间件。
S
Sridhar

如果您使用的是快递 > 4.16,您可以使用 express.json()express.urlencoded()

添加了 express.json() 和 express.urlencoded() 中间件以提供开箱即用的请求正文解析支持。这使用了下面的 expressjs/body-parser 模块模块,因此当前单独需要该模块的应用程序可以切换到内置解析器。

来源 Express 4.16.0 - Release date: 2017-09-28

有了这个,

const bodyParser  = require('body-parser');

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

变成,

const express = require('express');

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

意味着我们不再需要安装正文解析器了??
是的。我们不将它作为单独的包装,因为它现在可以作为快递的一部分使用。
我得到 SyntaxError: Unexpected token n in JSON at position 6 at JSON.parse ()
A
Abraham

不要使用正文解析器

如果您使用的是 Express 4.16+,您可以使用 express 执行此操作:

app.use(express.urlencoded({extended: true}));
app.use(express.json()) // To parse the incoming requests with JSON payloads

您现在可以使用 npm uninstall body-parser 卸载 body-parser

要获取 POST 内容,您可以使用 req.body

app.post("/yourpath", (req, res)=>{

    var postData = req.body;

    //Or if this doesn't work

    var postData = JSON.parse(req.body);
});

我希望这有帮助


V
Vaidh

即使我面临同样的问题。我提到的以下更改解决了我的问题。

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

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

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

您现在可以将上面的行替换为:

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

由于 express.json() 中的代码是基于 bodyparser.json() 的,因此这不应在您的应用程序中引入任何重大更改。

如果您的环境中还有以下代码:

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

您可以将上面的行替换为:

app.use(express.urlencoded()); //解析 URL 编码的正文

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

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

最后的注意事项:

如果您使用的是 Express 4.16+,您可能不需要将额外的 body-parser 包安装到您的应用程序中。有很多教程都包含 body-parser 的安装,因为它们的日期早于 Express 4.16 的发布。


这很有趣,因为在 express.json() 下使用相同的已弃用 body-parse.json()
是的!但不知何故,express.JS 开发团队通过将一行代码替换为另一行代码来简化 json 解析策略/配置,这在语法上并没有太大区别。
我的控制台说我仍然必须使用 express 4.17.1 将 extended 传递给 express.urlencoded({extended: true})
@Hache_raw 我不确定,但我想这取决于您是否以某种方式使用了 UTF-8 编码,或者它现在确实已经改变了。如果您参考此 express.js urlencoding link doc 会更好。
H
Hitesh Joshi

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

app.use(express.bodyparser()); 

因为 body-parser 是 node 和 express 之间的中间件。现在我们必须像这样使用它:

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

我想你想说“body-parser 是中间件”? express 不是我理解的中间件
J
John Haugeland

body-parser 是一个快速中间件,它读取表单的输入并将其存储为可通过 req.body 访问的 javascript 对象 必须安装“body-parser”(通过 npm install --save body-parser)有关更多信息,请参阅: https://github.com/expressjs/body-parser

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

extended 设置为 true 时,放气(压缩)的物体将被充气;当 extended 设置为 false 时,将拒绝放气的实体。


L
Lakpriya Senevirathna

而不是 bodyParser.json(),只需使用 express.json(),您不想安装 body-parser

例如,

const express = require("express");

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

L
Laurel

我发现在添加时

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

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

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

在这种情况下,您需要同时捕获 body 和 url 参数并使用可用的参数(在下面的案例中优先使用 body 参数)

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

B
Basheer AL-MOMANI

您对使用 express-generator 会生成骨架项目有什么看法,without deprecated messages 出现在您的日志中

运行这个命令

npm install express-generator -g

现在,通过在 your Node projects folder 中键入此命令来创建新的 Express.js 启动应用程序。

express node-express-app

该命令告诉 express 生成名为 node-express-app 的新 Node.js 应用程序。

然后使用命令 Go to the newly created project directoryinstall npm packagesstart the app

cd node-express-app && npm install && npm start

这会有帮助吗?
a
aashray jain

body-parser deprecated bodyParser: 使用单独的 json/urlencoded 中间件 node_modules\express\lib\router\layer.js:95:5

express deprecated req.host: 使用 req.hostname 代替 node_modules\body-parser\index.js:100:29

body-parser deprecated undefined extended:提供扩展选项 node_modules\body-parser\index.js:105:29

无需更新 express 或 body-parser

这些错误将被删除。按着这些次序 :-

app.use(bodyParser.urlencoded({extended: true})); // 这将有助于编码。 app.use(bodyParser.json()); // 这将支持 json 格式

它会运行。

快乐编码!


A
Aathi

检查这个答案Stripe webhook error: No signatures found matching the expected signature for payload

// Use JSON parser for all non-webhook routes
app.use((req, res, next) => {
  if (req.originalUrl === '/webhook') {
    next();
  } else {
    express.json()(req, res, next);
  }
});

// Stripe requires the raw body to construct the event
app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
  const sig = req.headers['stripe-signature'];

  let event;

  try {
    event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
  } catch (err) {
    // On error, log and return the error message
    console.log(`❌ Error message: ${err.message}`);
    return res.status(400).send(`Webhook Error: ${err.message}`);
  }

  // Successfully constructed event
  console.log('✅ Success:', event.id);

  // Return a response to acknowledge receipt of the event
  res.json({received: true});
});

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅