如何parsing我的JSON与外部中间件现在Express不带身体分析器?

如何parsing我的JSON与外部中间件现在Express不带身体分析器?

有一段时间,我使用Express bodyParser接收和响应到服务器的JSONpost。 每次我启动服务器时,表示说bodyParser很快就会被删除,果然,我已经更新,现在JSON请求似乎显示为空。

所以我不明白中间件是如何工作的,并且遵循一个快速教程来使用body parser。 现在,使用单独的身体分析器中间件,似乎我做错了。

以前,我的语法是:

app.use(express.bodyParser()); 

现在,以模块体parsing器作为中间件,就像这样:

 app.use(bodyParser.json()); 

整个例子:

 var express = require('express'); var bodyParser = require('body-parser'); var app = express(); function listen() { app.use(bodyParser.json()); app.post('/login', function (req, res) { var username = req.body.username; var password = req.body.password; console.log('User ' + username + ' is attempting login...'); validate(username, password, function (err, result) { if (err) loginFail(req, res, err); else loginSucceed(req, res, result); }); }); app.listen(3333); } listen(); 

我尝试了express.json()作为中间件,但是会触发致命错误:

 Error: Most middleware (like json) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware. 

该链接通过app.use(bodyParser.json())我正在使用的body-parser中间件 。


更新:

使用bodyParser.json()不会导致错误,但数据值为空:

用户未定义尝试login…

我的客户代码应该没问题,但这里是完整的:

 function sendLogin() { popLogCreds(creds); var loginCredentials = { "username": creds.username, "password": creds.password }; console.log("Sending login credentials: " + JSON.stringify(loginCredentials, null, 4)); request = $.ajax({ url: "http://54.186.131.77:3333/login", type: "POST", crossDomain: true, data: loginCredentials, dataType: "json", error: function () { postError("Uh Oh! The Officeball server is down."); }, success: function (data) { var ParsedData = data; sessionStorage.username = creds.username; sessionStorage.password = creds.password; sessionStorage.fname = ParsedData.fname; sessionStorage.lname = ParsedData.lname; sessionStorage.rank = ParsedData.rank; console.log(sessionStorage); window.location.replace("app.html"); } }); } 

其结果是:

 Sending login credentials: { "username": "jonathan@evisiion.com", "password": "J******!" } 

然后结果是POST的错误输出,就像上面那样:

 error : function () { postError("Uh Oh! The Officeball server is down."); } 

不要从字面上看错误信息。 只是意味着发生了错误。 事实上,服务器正在获取该请求,如上所示。

默认情况下, $.ajax()按照processData选项的说明中所述发送URL编码的 data

默认情况下,作为对象传递给数据选项的数据(技术上,除了string以外的任何东西)将被处理并转换为查询string,以适应默认的内容types“application / x-www-form-urlencoded” 。

与该Content-Type和格式相对应的body-parserurlencoded()

 app.use(bodyParser.urlencoded()); 

如果您希望为请求使用JSON,则需要提供已经格式化的data以及bodyParser.json()识别的匹配contentType

 request = $.ajax({ url: "http://54.186.131.77:3333/login", type: "POST", crossDomain: true, data: JSON.stringify(loginCredentials), contentType: 'application/json', dataType: 'json' // ... }); 

注意跨域:通过这些修改,服务器将不得不处理路由的预检OPTIONS请求 。


而且请注意, HEADGET请求不需要bodyParser ,因为data包含在URL中而不是正文中。 Express分别parsing为req.query