Node.js nodejs express post请求中的请求正文为空
我很难将简单的json数据从javascript ajax客户端发送到nodejs express rest api 以下是服务器端代码:Node.js nodejs express post请求中的请求正文为空,node.js,ajax,api,express,Node.js,Ajax,Api,Express,我很难将简单的json数据从javascript ajax客户端发送到nodejs express rest api 以下是服务器端代码: //POST api/login app.post('/api/login', (req, res) => { console.log(req.body)//here the body always empty object var body = _.pick(req.body, ['email', 'password']) con
//POST api/login
app.post('/api/login', (req, res) => {
console.log(req.body)//here the body always empty object
var body = _.pick(req.body, ['email', 'password'])
console.log(body)
var user;
User.findByCredentials(body.email, body.password).then((result) => {
user = result
return user.generateAuthToken()
}).then((token) => {
res.status(200).header('x-auth', token).send(user)
}).catch((e) => {
res.status(400).send('Unauthorized')
})
})
以下是客户端:
$(document).ready(function(){
jQuery('#login-form').on('submit', function(e){
e.preventDefault()
var username = jQuery('[name=username]').val()
var password = jQuery('[name=password]').val()
if(username && password){
let dataToSend = {
"email":username,
"password":password
}
console.log(dataToSend)
$.ajax({
url:"http://192.168.1.22:3000/api/login",
type: "POST",
data: dataToSend,
headers: {
'Access-Control-Allow-Origin':"*",
'Content-Type': 'application/json; charset=utf-8',
Accept: 'application/json'
},
dataType: 'json',
cache: false,
success: function(data){
console.log('on success : '+data);
},
error: function(e){
console.log("login error, status: "+e.status +" message :
"+e.responseText);
}
})
}
})
})
问题是,如果像这样发送请求,服务器端会出现崩溃错误:
SyntaxError: Unexpected token e in JSON at position 0
at JSON.parse (<anonymous>)
at createStrictSyntaxError (D:\NodeJs-Projects\location-tracker-server\node_modules\body-parser\lib\types\json.js:158:10)
at parse (D:\NodeJs-Projects\location-tracker-server\node_modules\body-parser\lib\types\json.js:83:15)
at D:\NodeJs-Projects\location-tracker-server\node_modules\body-parser\lib\read.js:121:18
at invokeCallback (D:\NodeJs-Projects\location-tracker-server\node_modules\raw-body\index.js:224:16)
at done (D:\NodeJs-Projects\location-tracker-server\node_modules\raw-body\index.js:213:7)
at IncomingMessage.onEnd (D:\NodeJs-Projects\location-tracker-server\node_modules\raw-body\index.js:273:7)
at emitNone (events.js:106:13)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1056:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
SyntaxError:JSON中位于位置0的意外标记e
在JSON.parse()处
在createStrictSyntaxError(D:\NodeJs项目\location tracker服务器\node\u模块\body解析器\lib\types\json.js:158:10)
解析时(D:\NodeJs Projects\location tracker server\node\u modules\body parser\lib\types\json.js:83:15)
位于D:\NodeJs Projects\location tracker server\node\u modules\body parser\lib\read.js:121:18
在invokeCallback(D:\NodeJs Projects\location tracker server\node\u modules\raw body\index.js:224:16)
完成时(D:\NodeJs Projects\location tracker server\node\u modules\raw body\index.js:213:7)
在IncomingMessage.onEnd(D:\NodeJs Projects\location tracker server\node\u modules\raw body\index.js:273:7)
在emitNone(events.js:106:13)
在IncomingMessage.emit(events.js:208:7)
在endReadableNT(_stream_readable.js:1056:12)
at _combinedTickCallback(内部/流程/下一步_tick.js:138:11)
在进程中。_tick回调(内部/process/next_tick.js:180:9)
如果我从请求中删除头数据,它不会崩溃,但我总是在服务器上收到空的正文,最烦人的是,如果我从android本机客户端发出相同的请求,并且okHttp库都工作正常。
我错过了什么吗?好吧,在多次组合之后,我解决了它,因为某种原因,只有在我调用了
JSON.stringify(dataToSend)
并在请求中添加了contentType:“application/JSON;charset=utf-8”
之后,我才能成功地在服务器上接收数据。
我仍然不清楚为什么需要对数据进行字符串化
完整客户端代码:
$(document).ready(function(){
jQuery('#login-form').on('submit', function(e){
e.preventDefault()
var username = jQuery('[name=username]').val()
var password = jQuery('[name=password]').val()
if(username && password){
let dataToSend = {
"email":username,
"password":password
}
dataToSend = JSON.stringify(dataToSend)
console.log(dataToSend)
$.ajax({
url:"http://192.168.1.22:3000/api/login",
method: "POST",
data: dataToSend,
contentType: "application/json;charset=utf-8",
dataType: 'json',
cache: false,
success: function(data){
console.log('on success : '+data);
},
error: function(e){
console.log("login error, status: "+e.status +" message : "+e.responseText);
}
})
}
})
})
我很确定只能在服务器上设置
Access Control Allow Origin
和Accept
标题。我也在服务器上设置了它们,但如果我将其从请求中删除,则无法帮助我尝试所有可能的组合