关于Angular2 + node接口调试的解决方案

关于Angular2 + node接口调试的解决方案,主要可以从以下几个方面入手:

1. 安装Body-parser模块和CORS模块

在Node端,我们需要通过这两个模块来对请求和响应进行处理,解决跨域问题。在项目根目录下使用npm安装这两个模块:

npm install body-parser cors --save

在Node端的app.js文件中使用以下代码完成引入、配置:

const express = require('express');
const cors = require('cors');
const bodyparser = require('body-parser');

const app = express();

app.use(cors());
app.use(bodyparser.json());

2. 设置代理

在大部分情况下,前端和后端是分离的,存在跨域问题。解决跨域问题的办法有很多,其中较为简单有效的方案是设置代理。在Angular2中,需要到proxy.conf.json文件中进行配置。

示例:

假设后端接口地址是http://localhost:3000/api/users,我们在proxy.conf.json中配置代理:

{
  "/api/*": {
    "target": "http://localhost:3000",
    "secure": false,
    "changeOrigin": true
  }
}

3. 在服务端和客户端分别设置环境变量

为了避免因为前后端环境变量设置不一致导致的调试问题,我们需要在服务端和客户端分别设置环境变量。在服务端的app.js文件中加入以下代码:

process.env.NODE_ENV = 'development';

在客户端的environment.ts文件中加入以下代码:

export const environment = {
  production: false,
  API_URL: 'http://localhost:4200/api'
};

示例1:调用Node API中存储在MongoDB中的数据

具体步骤如下:

  1. 安装mongoose
npm install mongoose --save
  1. 在mongoose.js文件中编写代码连接MongoDB数据库
const mongoose = require('mongoose');
const MONGODB_URI = 'mongodb://localhost/myapp_test';
mongoose.connect(MONGODB_URI, {
  useNewUrlParser: true,
  useCreateIndex: true,
  useUnifiedTopology: true
}, err => {
  if (err) {
    console.log(err);
  } else {
    console.log('MongoDB Connected');
  }
});
  1. 新建model并建立与数据库的映射
const UserSchema = new mongoose.Schema({
  name: String,
  email: String,
  password: String
});

const User = mongoose.model('User', UserSchema);
module.exports = User;
  1. 在routes目录下,新建users.js文件,实现查询用户信息的API接口
const express = require('express');
const router = express.Router();
const User = require('../models/User');

router.get('/:id', (req, res) => {
  User.findById(req.params.id)
    .then(user => {
      if (!user) {
        return res.status(404).send();
      }
      res.send(user);
    })
    .catch(err => {
      res.status(500).send(err);
    });
});

module.exports = router;
  1. 在app.js中注册/users路由
const usersRouter = require('./routes/users');
app.use('/api/users', usersRouter);
  1. 在前端调用users接口

在前端的users.component.ts文件中,编写以下代码调用API:

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import { environment } from '../../environments/environment';

@Component({
  selector: 'app-users',
  templateUrl: './users.component.html',
  styleUrls: ['./users.component.scss']
})
export class UsersComponent implements OnInit {
  user: any;

  constructor(private http: HttpClient) { }

  ngOnInit(): void {
    this.http.get(`${environment.API_URL}/users/5f1d6b356f25f237b3e0366c`)
      .subscribe(data => {
        console.log(data);
        this.user = data;
      });
  }
}

这里假设我们要查询的用户ID是5f1d6b356f25f237b3e0366c,我们并没有手动设置CORS,也没有手动设置请求头部,而是使用了通过proxy.conf.json配置的代理。

示例2:使用Passport验证用户登录

以下以username/password方式的验证为例。

  1. 安装passport相关模块
npm install passport passport-local passport-jwt jsonwebtoken bcryptjs --save
  1. 在passport.js文件中编写代码
const passport = require('passport');
const localStrategy = require('passport-local').Strategy;
const jwtStrategy = require('passport-jwt').Strategy;
const extractJwt = require('passport-jwt').ExtractJwt;
const bcrypt = require('bcryptjs');
const User = require('../models/User');

// 验证username/password
passport.use(new localStrategy({
  usernameField: 'email'
}, (email, password, done) => {
  User.findOne({
      email: email
    })
    .then(user => {
      if (!user) {
        return done(null, false, {
          message: 'Incorrect email.'
        });
      }
      bcrypt.compare(password, user.password)
        .then(isMatch => {
          if (isMatch) {
            return done(null, user);
          } else {
            return done(null, false, {
              message: 'Incorrect password.'
            });
          }
        });
    })
    .catch(err => {
      console.log(err);
    });
}));

// 验证token
passport.use(new jwtStrategy({
    jwtFromRequest: extractJwt.fromAuthHeaderAsBearerToken(),
    secretOrKey: process.env.JWT_SECRET
  },
  (jwt_payload, done) => {
    User.findById(jwt_payload.sub)
      .then(user => {
        if (user) {
          done(null, user);
        } else {
          done(null, false);
        }
      })
      .catch(err => {
        done(err, false);
      });
  }
));
  1. 新增/login路由,实现登录接口

在users.js中新增/login路由以实现获取token的功能。

const express = require('express');
const router = express.Router();
const passport = require('passport');

router.post('/login', (req, res, next) => {
  passport.authenticate('local', {
    session: false
  }, (err, user, info) => {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(400).json({
        message: info.message
      });
    }
    req.login(user, {
      session: false
    }, err => {
      if (err) {
        return next(err);
      }
      const payload = {
        sub: user.id,
        iat: Date.now()
      };
      const authToken = jwt.sign(payload, process.env.JWT_SECRET);
      return res.json({
        user: user,
        token: authToken
      });
    });
  })(req, res, next);
});

module.exports = router;

这里使用了jwt模块生成token。

  1. 在前端调用接口

在前端的login.component.ts文件中,编写以下代码调用API:

import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';

import { environment } from '../../environments/environment';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {
  form: FormGroup;

  constructor(private http: HttpClient, private router: Router) { }

  ngOnInit() {
    this.form = new FormGroup({
      email: new FormControl(''),
      password: new FormControl('')
    });
  }

  onSubmit() {
    this.http.post(`${environment.API_URL}/users/login`, this.form.value)
      .subscribe(data => {
        console.log(data);
        localStorage.setItem('authToken', data.token);
        this.router.navigate(['/']);
      }, err => {
        console.log(err);
      });
  }
}

这里假设我们使用了jsonwebtoken模块生成token,此处代码含义是将email和password通过POST方式发送给后端进行验证,返回用户信息以及生成的token,最后将token保存在localStorage中以供后续使用。

以上两个示例可以供你作为参考。当然,实际开发中还有各种问题,需要结合具体的应用场景来进行调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Angular2 + node接口调试的解决方案 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs高版本降为低版本的详细解决方案

    下面我就详细讲解“nodejs高版本降为低版本的详细解决方案”的完整攻略,包括以下几个步骤: 1. 确定要求的低版本 首先,需要确定要将Node.js版本降到哪个低版本。建议在Node.js官方文档中,查找要求的低版本Node.js的版本号和下载地址。例如,我们要将Node.js版本降级到v12.18.4,那么可以在官网中找到该版本的下载页面:https:/…

    node js 2023年6月8日
    00
  • NodeJS 实现手机短信验证模块阿里大于功能

    下面按照标准的 Markdown 格式给出详细的讲解: NodeJS 实现手机短信验证模块阿里大于功能 1. 介绍 阿里大于是阿里云的短信服务,提供了丰富的短信发送功能,可以用于各种短信发送需求。在 NodeJS 中,我们可以使用 阿里大于的 NodeJS SDK 来进行开发。 2. 准备工作 在开始之前,需要确保已经申请了阿里大于的短信服务,并获取到了 A…

    node js 2023年6月8日
    00
  • 一文带你了解Node.js中的path模块

    一文带你了解Node.js中的path模块 1. 什么是path模块? Node.js中的path模块是一个用于处理文件路径的模块。它提供了许多用于处理文件路径的方法。 2. path模块中的常用方法 2.1 path.join() 该方法将所有给定的路径连接在一起,并返回规范化的路径。例如: const path = require(‘path’); co…

    node js 2023年6月8日
    00
  • webpack打包node.js后端项目的方法

    下面是“webpack打包node.js后端项目的方法”的完整攻略。 1. 确认项目结构 首先要确认项目结构是否满足webpack打包的要求。在将node.js后端项目使用webpack打包前,请先确认项目目录结构是否符合以下要求: 项目根目录下应该有一个 main.js 或者 index.js 的入口文件。 项目应该统一使用 import/export 语…

    node js 2023年6月8日
    00
  • 浅谈react前后端同构渲染

    下面是关于“浅谈React前后端同构渲染”的攻略: 一、什么是前后端同构渲染? 前后端同构渲染(server-side rendering, SSR)是指在服务端将React代码渲染成HTML字符串,并把这些字符串发送到客户端,在客户端再进行React组件的挂载和事件绑定等操作。通过同构渲染,我们可以实现更好的SEO、更快的内容呈现以及更好的用户体验。 二、…

    node js 2023年6月8日
    00
  • TypeScript获取二叉树的镜像实例

    让我来为您详细讲解“TypeScript获取二叉树的镜像实例”的完整攻略。 什么是二叉树的镜像 在计算机科学中,二叉树(Binary Tree)是一种树形结构,在二叉树中,每个节点最多有两个子节点。 如下图所示,它是一颗二叉树。 4 / \ 2 7 / \ / \ 1 3 6 9 “镜像”是指将一棵二叉树的左右子树镜像对称,如下图所示: 4 / \ 7 2 …

    node js 2023年6月8日
    00
  • Node.js开发静态资源服务器

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,可以用于开发高效的网络应用程序。在使用Node.js进行Web开发时,经常需要开发一个静态资源服务器来提供网站所需的静态文件(如HTML、CSS、JavaScript、图片等),以加快网站的访问速度和提高用户体验。 下面是基于Node.js开发静态资源服务器的完整攻略: 步骤一:搭…

    node js 2023年6月8日
    00
  • 详解JavaScript 中的批处理和缓存

    详解JavaScript中的批处理和缓存 在Web开发中,对于一些性能敏感的操作,如果没有进行优化的话,往往会给用户带来较差的体验。因此,批处理和缓存常常被用作优化手段,以提高Web应用的性能。 批处理 批处理是指将多个操作打包成一次操作来减少开销的一种技术。在JavaScript中,批处理可以应用在DOM操作和样式操作中。 批处理的原理 在JavaScri…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部