Получение неверных данных из API Node JS - PullRequest
1 голос
/ 18 января 2020

Я надеюсь, что не повторял этот вопрос, но я не нашел ни одного в stackoverflow.

это метод входа в систему, я отправляю код состояния 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();
  });

1 Ответ

1 голос
/ 19 января 2020

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...