Как связаться от внутреннего интерфейса до внешнего интерфейса в приложении стека MEAN? - PullRequest
2 голосов
/ 27 сентября 2019

Я новичок в приложении стека MEAN, и у меня возникли некоторые проблемы при попытке отправить данные с сервера во внешний интерфейс.Тем не менее, у меня есть некоторое общение, но это все, что я могу сделать.На сервере у меня есть сообщение json, которое отправляется.

Сервер

router.route("/users/register").post((req, res) => { 

registerLogin.findOne({ $or: [{ username }, { email }]}, (err, user) => {
        if (err)
            res.send(err);

        else if (!username || !email || !password)  
            res.status(403).json({ registerErrRequired: "Fill out whole form." });

Внешний интерфейс

 registerUser(username, email, password)  {
    const user =  {
      username: username,
      email: email,
      password: password
    };
    return this.http.post(`${this.uri}/users/register`, user)
    .pipe(map(response => console.log(response)))

    .subscribe(() => { this.router.navigate(["/users/login"]) }, (errResp) => {

      errResp.error ? this.ngFlashMessageService.showFlashMessage({

        messages: [errResp.error.registerErrRequired], // Where json message gets caught and shown to the browser
      dismissible: true,
      timeout: false,
      type: 'danger'
      }) : console.log("An unkown error occured.");
    });
  }

Это работает хорошо, но я не могу выполнять запросы / запросы, кроме как использовать флэш-сообщение.Моя проблема заключается в желании использовать его другими способами, чем просто флэш-сообщения.Например, если у пользователя нет сеанса, я хочу, чтобы он вернулся обратно на страницу входа.Вот что я попробовал, но не получилось.

Сервер

// Middleware
const redirectLogin = ((req, res, next) => {
    if (!req.session.user) 
        res.status(401).json({ loggedIn: false });
    else
        next();
}); 
// Route
router.route("/home").get(redirectLogin, (req, res) => {
    Blog.find((err, docs) => {
        if (err)
        console.log(err);
    else
        res.json(docs);
    }); 
});

Внешний интерфейс

homePage() {
  // Here is where I would like to say, If session, then true, else navigate(["/users/login"])
   if (loggedIn === false)
       this.router.navigate(["/users/login"])
   else
       // Success
  return this.http.get(`${this.uri}/home`);
}

Единственный способ, которым я нашел связь, - отправка сообщений об ошибках, но не более того.

1 Ответ

1 голос
/ 27 сентября 2019

Что вы можете сделать, это вызвать API, чтобы проверить, вошел ли пользователь в систему или нет в ngOnInit ловушке жизненного цикла, поэтому каждый раз, когда загружается ваш компонент, вы можете проверить, существует ли сеанс на бэкенде, и соответствующим образом маршрутизировать.

 export class App implements OnInit{
          constructor(){
             //called first time before the ngOnInit()
          }

          ngOnInit(){
           //CheckLogin() is a method in your service which calls your backend api
             this.http.post("your authentication url to check if session exits ",{username:username}).subscribe(data=>{
            if (data["loggedIn"] === false)

               this.router.navigate(["/users/login"])


        }) 
          }

}

Angular также имеет HTTP interceptors, вы можете решить эту проблему с помощью перехватчиков jwt и http

...