关于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 socket实现的服务端和客户端功能示例

    我来为您讲解一下“nodejs socket实现的服务端和客户端功能示例”的完整攻略,希望能对您有所帮助。 简介 Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它是一个开放源代码、跨平台的服务器端运行环境。在Node.js中,socket可以用来实现服务器与客户端之间的数据传输。本文将介绍Node.js中如何使用socket实…

    node js 2023年6月8日
    00
  • JS获取网址中指定值的正则函数

    获取网址中指定值的功能是前端开发中常用的功能之一。可以利用正则表达式(RegExp)对URL字符串进行解析得到所需的参数。下面是完整的攻略: 1. 获取网址中指定值的正则函数 首先定义一个名为getQueryString的函数,传入两个参数:网址URL和要查询的参数名称。 function getQueryString(url, name) {} 在函数内部…

    node js 2023年6月8日
    00
  • Node.js API详解之 dgram模块用法实例分析

    那么首先我们需要了解一下Node.js API中的dgram模块。该模块是Node.js的内置模块之一,用于在UDP数据报套接字上提供了一个异步的事件驱动操作。 dgram模块的基本概念 在使用dgram模块之前,我们先来了解一些UDP协议的基本概念。 UDP(User Datagram Protocol)用户数据报协议是一种面向数据报的无连接协议,也就是说…

    node js 2023年6月8日
    00
  • coffeescript使用的方式汇总

    Coffeescript使用的方式汇总 Coffeescript是一种将CoffeeScript代码编译成JavaScript代码的语言。它通过简化JavaScript代码来提高开发人员的生产力,具有简洁、可读、可维护的特点。本文将介绍Coffeescript的使用方式。 安装Coffeescript 要使用Coffeescript,首先需要安装它。在命令行…

    node js 2023年6月8日
    00
  • Nest 复杂查询示例解析

    Nest 复杂查询示例解析 简介 Nest 是一个基于 Node.js 平台的开发框架,它利用现代化的 JavaScript 技术为构建可伸缩的服务器端应用程序提供了一种优美且快速的方式。 在 Nest 中,ORM(对象关系映射)库 TypeORM 可以用于构建复杂的 SQL 查询,并通过 Nest 提供的数据访问对象(Data Access Object,…

    node js 2023年6月8日
    00
  • node.js 实现手机号验证码登录功能

    关于如何实现“node.js 实现手机号验证码登录功能”的攻略,我可以提供如下的完整步骤。 步骤一:安装依赖库 要实现手机号验证码登录功能,需要使用到一些第三方依赖库,比如 express、jsonwebtoken、bcryptjs 等。可以通过以下命令安装: npm install express jsonwebtoken bcryptjs 步骤二:设计接…

    node js 2023年6月8日
    00
  • JS事件循环-微任务-宏任务(原理讲解+面试题分析)

    JS事件循环-微任务-宏任务 在JS中,事件循环是一种非常重要的机制。通过事件循环,我们可以更好地实现代码的异步执行。了解JS事件循环的机制,也是在前端开发中非常必要的一项知识。 事件循环机制 事件循环机制是指JS引擎处理JS代码的一种机制。简单来说,JS引擎在执行JS代码时,会按照特定的顺序去处理事件,而这个顺序就是事件循环。与此同时,JS引擎还会把这些事…

    node js 2023年6月8日
    00
  • Node中node_modules文件夹及package.json文件的作用说明

    Node中node_modules文件夹及package.json文件的作用说明 当我们使用Node.js开发项目时,经常会涉及第三方模块或库的引入和使用。对于一些简单的项目,我们可以直接在代码中通过require函数引入第三方模块,但是对于复杂的项目来说,这样的操作非常繁琐,而且也不容易管理项目依赖。Node.js提供了node_modules文件夹和pa…

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