如何消除 Connect 3.0 废弃警告?

75

我是一个使用 express.js 创造 Web 应用的 node.js 开发者。 目前我遇到的问题是:

每当我在电脑上创建一个应用程序,npm 安装其相关内容并运行它(使用 node app.js 和 nodemon),都会在控制台中收到以下消息:

connect.multipart() will be removed in connect 3.0
visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives
connect.limit() will be removed in connect 3.0
Express server listening on port 3000

应用程序可以正常工作。但是当我克隆其他计算机上创建的应用程序时,我没有收到那个消息,所以我认为我的计算机上有一些过时的东西。

我访问了消息中提到的网站并确认了我的猜测。那是一个弃用警告。然而,我已经更新了node和npm以及全局express,但我仍然收到这个提示。

因此,我的问题是:我不知道我需要更新什么才能摆脱弃用提示,因为它们让我感到恐慌。


你尝试过直接使用其他库吗?比如multiparty(它是express后台使用的)- 在http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html的文章底部有一个很好的列表。 - guy mograbi
3个回答

170

这是一个警告,一旦Express更新为使用Connect 3.0,它将会消失 - 作为临时解决方案,请遵循https://github.com/senchalabs/connect/wiki/Connect-3.0顶部的说明。具体来说,在您的应用程序中找到此行:

app.use(express.bodyParser());

将其替换为以下内容(这就是 bodyParser 在 3.0 中的样子):

app.use(express.json());
app.use(express.urlencoded());

1
连接3.0问题的更多信息请参见:https://groups.google.com/d/msg/express-js/iP2VyhkypHo/5AXQiYN3RPcJ - fernandopasik
16
我还需要添加 app.use(express.multipart()),因为我的多部分表单停止工作了(当然),这也带回了弃用警告(当然)。 - a paid nerd
5
请使用维基中列出的多部分解析器之一,不要使用connect/express的。 - Jonathan Ong
1
谢谢!我差点就要疯了。 - Marcus Hammarberg

60

我负责这个废弃通知。你读过维基了吗? https://github.com/senchalabs/connect/wiki/Connect-3.0

步骤1:直接使用每个解析器,而不是app.use(express.bodyParser());

app.use(express.json());
app.use(express.urlencoded());

第二步:使用不同的多部分解析器,例如:可以使用connect-multiparty


app.use(require('connect-multiparty')())

因为Node.js 0.12版本发布需要一些时间,所以还没有开始在Connect 3和Express 4上的工作。目前尚无更新。


1
这不是一个弃用通知 - 而是一个重大变更。app.use(express.bodyParser)在最新版本中不再起作用,但库的主要版本号没有改变,这破坏了语义化版本控制的概念。 - tkone
运行最新版本的 npm install express,并执行非常简单的代码:var express = require('express'), app = express(); app.use(express.bodyParser); app.get('/', function(req,res){ res.send(200, 'ok');}); app.listen(3000);。向 http://localhost:3000/ 发送请求会导致 curl 和浏览器挂起,并打印警告。删除 app.use(express.bodyParser) 或切换到 app.use(express.json()) 会使应用程序返回 HTTP 状态码 200 的 "ok"。 - tkone
它是connect-multiparty,而不是connect-multipart。 - Vince Yuan
1
我希望有一个选项可以抑制这个警告;虽然弃用通知很重要,但在企业环境中很少没有抑制它们的选项。我的当前情况使我无法在至少6个月内进行必要的更改以避免该消息,但如果有配置选项,我可以做到。现在我们在日志中散布了这些内容,格式与其他任何内容都不同,使我们的旧日志解析器感到不太满意。只是思考的食物;弃用通知很重要,但开发人员需要一种方法来将它们排除在外。 - Kris
1
@Kris 如果你不能直接使用json和urlencoded中间件(可能是因为你正在使用multipart支持来处理文件上传),那么你可以在bodyParser被实例化时暂时覆盖console.log,然后再将其恢复。我曾经在Sails中使用过这种方法来规范我们的日志输出。 - mikermcneil
@JonathanOng 如果我删除body-parser,文件上传会失败,有什么解决方法吗? - Richie Fredicson

1

由于Express只是Connect的包装器,我建议直接使用Connect。

因此,不要使用: app.use(express.bodyParser());

使用:

connect = require('connect');
app.use(connect.json());
app.use(connect.urlencoded());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接