请大神救急,在线等,关于fetch发送亲求报错问题!
发布于 21 天前 作者 duzitengg 445 次浏览 来自 问答

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

回到顶部