Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Fetch未从节点Js接收错误消息_Javascript_Ajax_Fetch - Fatal编程技术网

Javascript Fetch未从节点Js接收错误消息

Javascript Fetch未从节点Js接收错误消息,javascript,ajax,fetch,Javascript,Ajax,Fetch,发生了什么: 我的项目有一个名为/login的路由,当用户尝试登录而他不是“管理员”(数据库的属性)时,它应该给出一个401错误。在后端,它正在工作,但在前端的提取中没有收到错误,我不知道为什么 My code Node.js: const{ findByMail }=需要('../data/acl/acl.model'); 模块.出口= 异步函数已验证(req、res、next){ const acl=await findByMail(req.body.username); if(acl&&a

发生了什么:

我的项目有一个名为
/login
的路由,当用户尝试登录而他不是“管理员”(数据库的属性)时,它应该给出一个401错误。在后端,它正在工作,但在前端的提取中没有收到
错误
,我不知道为什么

My code Node.js:

const{
findByMail
}=需要('../data/acl/acl.model');
模块.出口=
异步函数已验证(req、res、next){
const acl=await findByMail(req.body.username);
if(acl&&acl.role!=“管理者”){
res.status(401).send(“您没有访问权限”)
}
下一个()
}
我的前端:

handleLogin=async()=>{
试一试{
这是我的国家({
加载:正确
});
const rawResponse=wait fetch(“/login”{
方法:“POST”,
标题:{
接受:'application/json',
“内容类型”:“应用程序/json”
},
正文:JSON.stringify({…this.state)
}),
});
const response=await rawResponse.json();
setItem('user-token',response.token);
这是我的国家({
加载:错误
});
}捕捉(错误){
这是我的国家({
加载:错误
});
控制台日志(err);
}
};
Console.log:

SyntaxError: Unexpected token F in JSON at position 0
at Login._callee$ (login.js:18)
at tryCatch (runtime.js:62)
at Generator.invoke [as _invoke] (runtime.js:296)
at Generator.prototype.(anonymous function) [as next] (https://localhost:3000/static/js/bundle.js:103406:21)
at step (background.login.png:1)
at background.login.png:1

login.js:18 POST https://localhost:3000/login 401 ()

我不知道怎么了,有人能帮我吗?

问题很简单,fetch()不认为401代码是不可接受的响应,因此不会调用catch,相反,它会像200代码一样继续执行代码

收到回复后,您应该执行以下操作:

handleLogin = async() => {
  try {
    this.setState({
      loading: true
    });

    const rawResponse = await fetch('/login', {
      method: 'POST',
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ ...this.state
      }),
    });

    if(!rawResponse.ok){
      this.setState({
        loading: false
      });
    }
    else{
      const response = await rawResponse.json();

      localStorage.setItem('user-token', response.token);
      this.setState({
        loading: false
      });
    }

  } catch (err) {
    this.setState({
      loading: false
    });
    console.log(err);
  }
};

试着调试json如果它的格式正确,它会正确地进行提取,但是当到达
catch
时,错误的消息就不起作用了。你试着调试这行代码:json.stringify({…this.state}),你的响应是什么样子的?某个地方的一些代码正试图将以“F”开头的东西解析为json,这不是有效的JSON。您需要在浏览器开发工具的“网络”选项卡中检查请求的结果。您好,朋友,感谢您的回答,我将其放入
{catch(err){your code}
?我这样做:
catch(err){if(!err.ok){console.log(err.status)}
并且返回值是
未定义的
,我编辑了我的答案,并根据您的代码添加了一个工作示例。您不工作是什么意思?您有任何错误吗?返回值是
未定义的