suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Axios POST gibt nach API-Aufruf zurück: ERR_EMPTY_RESPONSE

Ich versuche, ein Registrierungsformular in einer Node.JS-Anwendung zu erstellen.

Wenn ich eine AXIOS-Post-Anfrage stelle, werden die Daten in meiner Datenbank gespeichert, aber das eigentliche Versprechen gibt immer noch undefiniert zurück. Die Nutzlast ist korrekt gefüllt. Um die Sache noch verwirrender zu machen, habe ich meinen Login-Code grundsätzlich in der Funktion gespiegelt und es funktioniert perfekt.

Der untenstehende Code dient zur Registrierung.

import axios from 'axios';
import { showAlert } from './alerts';

export const signup = async (name, email, password, passwordConfirm) => {
  try {
    const res = await axios({
      method: 'POST',
      url: 'http://127.0.0.1:3000/api/v1/users/signup',
      data: {
        name,
        email,
        password,
        passwordConfirm,
      },
    }) // res returns undefined.

    if (res.data.status === 'success') {
      showAlert('success', 'Signed up successfully!');
      window.setTimeout(() => {
        location.assign('/login');
      }, 1500);
    }
  } catch (err) {
    showAlert('error', err.response.data.message);
  }
};

Dies ist mein Benutzerrouter unter http://127.0.0.1:3000/api/v1/users

const authController = require('./../controllers/authController');
// const reviewController = require('./../controllers/reviewController');

const router = express.Router();

router.post('/signup', authController.signup);

Das ist mein AuthController mit Registrierungsfunktion.

const signToken = (id) => {
  return jwt.sign({ id: id }, process.env.JWT_SECRET, {
    expiresIn: process.env.JWT_EXPIRES_IN,
  });
};

const createSendToken = (user, statusCode, res) => {
  const token = signToken(user._id);
  const cookieOptions = {
    expires: new Date(
      Date.now() + process.env.JWT_COOKIE_EXPIRES_IN * 24 * 60 * 60 * 1000
    ),
    httpOnly: true,
  };

  if (process.env.NODE_ENV === 'production') cookieOptions.secure = true;

  res.cookie('jwt', token, cookieOptions);

  // Remove password from output
  user.password = undefined;

  res.status(statusCode).json({
    status: 'success',
    token,
    data: {
      user,
    },
  });
};

exports.signup = catchAsync(async (req, res, next) => {
  const newUser = await User.create({
    name: req.body.name,
    email: req.body.email,
    password: req.body.password,
    passwordConfirm: req.body.passwordConfirm,
    passwordChangedAt: req.body.passwordChangedAt,
    role: req.body.role,
  });
  const url = `${req.protocol}://${req.get('host')}/me`;
  await new Email(newUser, url).sendWelcome();

  createSendToken(newUser, 201, res);
});

Vielen Dank.

Da mein Authentifizierungscontroller eine 201-Antwort sendet, sollte dies meiner Meinung nach nicht passieren.

P粉014218124P粉014218124229 Tage vor496

Antworte allen(1)Ich werde antworten

  • P粉268654873

    P粉2686548732024-04-04 10:37:45

    then() 方法不会返回可等待的 Promise,而是采用一个回调函数,该回调函数将在请求完成时执行。 你需要改变这个:

     const res = await axios({
          method: 'POST',
          url: 'http://127.0.0.1:3000/api/v1/users/signup',
          data: {
            name,
            email,
            password,
            passwordConfirm,
          },
        }).then(console.log('hello world', res, 'hello')); // res returns undefined.

    进入此:

    const res = await axios({
      method: 'POST',
      url: 'http://127.0.0.1:3000/api/v1/users/signup',
      data: {
        name,
        email,
        password,
        passwordConfirm,
      },
    });
    
    console.log('hello world', res, 'hello'); 
    
    if (res.data.status === 'success') {
      showAlert('success', 'Signed up successfully!');
      window.setTimeout(() => {
        location.assign('/login');
      }, 1500);
    }

    Antwort
    0
  • StornierenAntwort