获取请求不 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));
我正在尝试从位于同一域的路由 /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));