我正在使用 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);
var server = express()
,但是在阅读(似乎是所有)下面的答案时,假设使用了行 var app = express()
。
这意味着截至 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()
下重新添加了正文解析器。
想要零警告?像这样使用它:
// 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 及更高版本的注意事项:已重新添加正文解析器以提供开箱即用的请求正文解析支持。
app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
如果您使用的是快递 > 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());
不要使用正文解析器
如果您使用的是 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);
});
我希望这有帮助
即使我面临同样的问题。我提到的以下更改解决了我的问题。
如果您使用的是 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 解析策略/配置,这在语法上并没有太大区别。
extended
传递给 express.urlencoded({extended: true})
在旧版本的 express 中,我们必须使用:
app.use(express.bodyparser());
因为 body-parser 是 node 和 express 之间的中间件。现在我们必须像这样使用它:
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
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 时,将拒绝放气的实体。
而不是 bodyParser.json()
,只需使用 express.json()
,您不想安装 body-parser
例如,
const express = require("express");
const app = express();
app.use(express.json());
我发现在添加时
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);
});
您对使用 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 directory
、install npm packages
和 start the app
cd node-express-app && npm install && npm start
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 格式
它会运行。
快乐编码!
检查这个答案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});
});
extended
有什么作用?curl --data "user[email]=foo&user[password]=bar" localhost:3000/login
将在req.body
中作为{ user[email]: "foo", ...}
被服务器接收,而req.body
将是{user: {email: "foo", ... }}
和extended: true
。express.json()