从 API Node JS 获取不正确的数据

Posted

技术标签:

【中文标题】从 API Node JS 获取不正确的数据【英文标题】:Getting not correct data from API Node JS 【发布时间】:2020-05-05 06:58:26 【问题描述】:

我希望我没有重复这个问题,但我在 *** 上没有找到任何问题。

这是一种登录方法,当有人正确登录时,我会发送带有用户对象的 200 状态代码作为响应, 但是在客户端,我只得到 200 的默认响应,当我使用错误的密码登录时,我得到 500 的默认响应,没有任何我发送的数据!正确登录时没有错误消息和对象。

这是中间件

我用

app.use(express.json());
app.use(bodyParser.json());

登录方式

exports.logIn =async (req,res)=>

 let email,password = req.body;
 let user;
 let passwordCorrect;
 try
   user = await UserModel.findOne(email:email);

   if(user)
       console.log("user found")
     passwordCorrect= await bcryptjs.compare(password,user.password);

     if(passwordCorrect)
       console.log("password correct")

       res.json(user:user)
     else
       console.log("password not")

       throw new Error("password is wrong");

     

   else
     console.log("user not found ")

     throw new Error("This user is not in our system");
   

 catch(err)
   console.log("catched error  ")
   console.log(err)

   res.status(500).json(
     status:'fail',
     message:err.message
   )

 




这是我正确登录时得到的响应, 响应缺少从服务器发送的数据, 并且如果密码错误,我会收到 500 而没有从服务器发送的错误消息

Response type: "cors", url: "http://localhost:8080/api/user/login", redirected: false, status: 200, ok: true, …
type: "cors"
url: "http://localhost:8080/api/user/login"
redirected: false
status: 200
ok: true
statusText: "OK"
headers: Headers 
body: (...)
bodyUsed: false
__proto__: Response

从我使用反应的客户端

  try

            const user  = await fetch("http://localhost:8080/api/user/login",
                headers:
                    "Content-Type":"application/json"
                ,
                method:"POST",
                body:JSON.stringify(data)
            );

              if(user.ok)
               // auth.login();
               console.log('ok')
               console.log(user)
            else
                console.log('not ok')

                console.log(user)

                setError(user.message)
            

         catch(err)

            console.log("error ")
            console.log(err);
            setError(err)

 

这是接受来自其他域的请求的中间件

app.use(function(req, res, next) 
    res.header("Access-Control-Allow-Origin", "*"); // update to match the domain you will make the request from
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Accses-Control-Allow-Methods","GET,POST,DELETE,PATCH");
console.log(req.body);
    next();
  );

【问题讨论】:

你能举例说明你如何发送请求和收到的响应吗? 是的,我会编辑我的问题 请在返回响应时使用 return 在这两种情况下 1. 成功响应 2. 错误响应 你有没有试过`next(err)` inside you catch? 【参考方案1】:

javascript fetch api 返回一个包含响应的承诺。这只是一个 HTTP 响应,而不是实际的 JSON。为了从响应中提取 JSON 正文内容,我们使用json() 方法。

所以你的代码应该是:

try 
  const response = await fetch("http://localhost:8080/api/user/login", 
    headers: 
      "Content-Type": "application/json"
    ,
    method: "POST",
    body: JSON.stringify(data)
  );

  if (response.ok) 
    console.log("ok");
    let user = await response.json();
    console.log("user: ", user);
   else 
    console.log("not ok");
    console.log(response);
    setError(response.message);
  
 catch (err) 
  console.log("error ");
  console.log(err);
  setError(err);

【讨论】:

以上是关于从 API Node JS 获取不正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

Node.js REST API 从 MongoDB 获取数据

使用youtube API和node.js添加youtube评论

如何从 Spotify Search API 获取数据并将其解析为 JSON? [在 node.js 中

如何正确配置服务器和浏览器以避免cors错误?获取 API + Node.js

React App 和 node.js 后端 api 安全获取

如何显示从 Node.js API 发送到 Next.js 的验证错误