获取请求不 return JSON 来自端点

Fetch request doesn't return JSON from an endpoint

我正在尝试从位于同一域的路由 /users 中的端点获取 JSON 数据,但不知何故我总是收到错误消息:

Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

当我查看错误的位置时,我得到了索引页面的来源(脚本是 运行 的同一页面)。

这是路线(Hapi.js):

allUsers: {
    method: 'GET',
    path: '/users',
    options: AuthHelper.required,
    handler: async (request, h) => {
        let users = [];
        let error = false;

        await User.find({})
        .lean().then(result => {
            if (result && result.length) users = db.filterResult(result);
        })
        .catch(err => {
            error = true;
            console.log(err);
        });

        if (error) {
            return { message: 'There is an error.' };
        } else {
            return { users: users };
        }
    }
}

这是客户端代码:

fetch('http://localhost:3000/users').then((response) => response.json()).then((json) => console.log(json));

当我直接在浏览器中访问 URL 时,我得到了结果。

对了,应该使用reply接口方法,这样hapi会自动转换成有效的JSON:

 allUsers: {
    method: 'GET',
    path: '/users',
    options: AuthHelper.required,
    handler: async (request, h) => {
        let users = [];
        let error = false;

        await User.find({})
        .lean().then(result => {
            if (result && result.length) users = db.filterResult(result);
        })
        .catch(err => {
            error = true;
            console.log(err);
        });

        if (error) {
            return { message: 'There is an error.' };
        } else {
            reply( { users: users } );
        }
    }
}

感谢 charlieftl,我意识到问题出在哪里。我打开了 Network 选项卡并跟踪请求的去向 - 这是一个登录页面。没有随请求发送凭据(从代码中可以看出,路由受到保护)所以响应总是返回索引页面的源,因为我被重定向回来了。

我只需要将 same-origin 属性 添加到 credentials 选项。

fetch('http://localhost:3000/users', { credentials: 'same-origin' }).then((response) => response.json()).then((json) => console.log(json));