如何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-parser
是urlencoded()
:
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
请求 。
而且请注意, HEAD
或GET
请求不需要bodyParser
,因为data
包含在URL中而不是正文中。 Express分别parsing为req.query
。