请大神救急,在线等,关于fetch发送亲求报错问题!
fetch 代码如下
import fetch from 'dva/fetch';
// 将对象拼接成 key1=val1&key2=val2&key3=val3 的字符串形式
function obj2params(obj) {
var result = '';
var item;
for (item in obj) {
result += '&' + item + '=' + encodeURIComponent(obj[item]);
}
if (result) {
result = result.slice(1);
}
return result;
}
// 发送 post 请求
export function post(url, paramsObj,token) {
var result = fetch(url, {
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/x-www-form-urlencoded',
'token':token
},
body: obj2params(paramsObj)
});
return result;
}
react发送请求代码如下:
this.props.form.validateFields((err, values) => {
if (!err) {
var result = post(conf.loginPath + "username=" + values.userName +
'&password=' + values.password, {
username: values.userName,
password: values.password
}, token
);
console.log(result)
result.then(res => {
return res.json();
}).then(json => {
console.log(json)
if (json.username) {
//储存用户信息
localStorage.setItem('username', json.username);
localStorage.setItem('power', json.power)
localStorage.setItem('id', json.id)
localStorage.setItem('token', json.token)
hashHistory.push('/firstPage')
} else {
this.setState({
showWarning: true
})
}
}).catch(function(e){
console.log(e)
})
}
koa2 后台代码如下:
=====================》加入此段代码报错
router.use(async (ctx, next) => {
let path = ctx.request.path;
if ('/users/login'===path) {
next();
} else {
let _token = ctx.request.headers.token || '';
//去数据库查询token
let token_query = await TokenModel.queryToken(_token);
let times = token_query.cTime;
if (token_query !== '' || token_query !== null) {
let exp = parseInt((new Date().getTime() - times) / 1000 / 60);
if (exp > 5) {
//从数据库删除记录
await TokenModel.deleteToken(token_query._id)
return ctx.body = { msg: 'timeOut' }
} else {
next();
}
}
}
})
======》当加入以上代码的时候报错
// 登录页面
router.post('/users/login', async (ctx, next) => {
let username = ctx.request.body.username || '';
let pwd = ctx.request.body.password || '';
let _token = ctx.request.headers.token || '';
console.log("username======"+username);
console.log("pwd======="+pwd)
console.log("_token======="+_token)
let password = crypto.createHash('md5').update(pwd).digest('hex');
if (username === '' || password === '') {
return;
}
//first in
if (_token) {
let user = await UserModel.check_password(username, password);
console.log(user)
if (user === null) {
return ctx.response.body = { user: 'null' };
}
let token = jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: 'foobar'
}, username);
//把token存入数据库
let token_result = await TokenModel.createToken(token, user._id);
return ctx.response.body = {
username: username,
power: user.power,
token: token,
id: user._id
};
}
});
\n```
最后前端报错如下:
POST http://localhost:3000/users/login?username=admin&password=111111 404 (Not Found)
login.js:72 SyntaxError: Unexpected token N in JSON at position 0
希望各位大神不吝赐教,不胜感激!!!!!!!!
4 回复
404是路由出了问题,先用postMan之类的看看链接地址在不在.
@duzitengg 404有2种情况 一种是路由没匹配上 一种是你没有返回数据 你post的请求数据应该放在body里 而不是query里 这样导致你 从request.body里取的几个值全是默认的’’ 另外报的这个错是你json数据解析有问题
报错的地方是你的路由无效,返回的404不能解析结果 所以报错了。 而且你fetch这样提交数据有点奇怪吧。。 你把路由内容清空然后返回一个数据看看能不能接受到 ~ 跟楼上一样说的postman可以检查路由通不通
感谢各位:问题已经解决,router.use的时候 最后执行next()的时候前面加上await