对应内容:#13 Hitting the API | Build a Complete App with GraphQL, Node.js, MongoDB and React.js

主要内容:

  • 完成登录、注册表单,及其对应的逻辑
  • 由于涉及前后端的通信,在后端实现跨域的中间件【及其重要】

1 完成表单部分的页面及其对应逻辑,修复了前面的BUG

这里ES6中的类,很多人不是很熟悉,类的属性的实现方式分两种,一种是写在constructor中的属性,一种是类字段,定义在构造函数之外的,类字段是直接赋值在类的对象实例上的,而普通属性是写在类的原型上的,因此类字段声明的函数表达式,是不需要进行this绑定的,在react官方文档中,明确说明了class 中声明的函数,要在构造函数中绑定一下this,这里要注意!!!!

这里用的是ref进行绑定,而没有使用官方文档中的setState,第二种写起来比较麻烦。

import React, { Component } from 'react';
import './Auth.css';class AuthPage extends Component  {constructor (props) {super(props);this.emailEl = React.createRef();this.passwordEl = React.createRef();this.state = {isLoginMode: true}}submitHandler = async (event) => {event.preventDefault();let email = this.emailEl.current.value;let password = this.passwordEl.current.value;if (email.trim() === "" || password.trim() === "") {return false;}const requestBody = {query: `mutation {createUser(userInput: {email: "${email}", password: "${password}"}) {_idemail}}`};if (this.state.isLoginMode) {requestBody.query = `query {login(email: "${email}", password: "${password}") {_idtokentokenExpiration}}`;}let response, data;try {response = await fetch(`http://localhost:3030/graphql`, {method: "POST",headers: {"Content-Type": "application/json"},body: JSON.stringify(requestBody)});data = await response.json();} catch (error) {throw error;}}swithHandler = () => {this.setState(prevState => {return {isLoginMode: !prevState.isLoginMode};})}render () {return (<React.Fragment><h1>The Auth Page</h1><form action="" className="auth-form" onSubmit={ this.submitHandler }><div className="form-control"><label htmlFor="email">Email</label><input type="email" id="email" ref={this.emailEl} /></div><div className="form-control"><label htmlFor="password">Password</label><input type="password" id="password" ref={this.passwordEl} /></div><div className="form-action"><button type="submit">Submit</button><button type="button" onClick={this.swithHandler}>swith to {this.state.isLoginMode ? "Signup" : "Signin"}</button></div></form></React.Fragment>);}
}export default AuthPage;

Auth.css

.auth-form {width: 300px;margin: 1rem auto;
}
label, input {display: block;width: 100%;
}
.form-action button {font: inherit;
}

在后端的auth resolver中我之前的代码有一个bug,在这里进行修复:

第四行那里少了一个await,并且稍微修改了一些逻辑

2 后端实现跨域中间件

app.use((req, res, next) => {res.setHeader("Access-Control-Allow-Origin", "*");res.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");res.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");if (req.method === "OPTIONS") {return res.sendStatus(200);}next();
})

具体原因,一行两行说不清楚,请在mdn中搜索cors或跨越。

Graphql 初体验 第十一章 | #13 Hitting the API(实现了登录注册表单)相关推荐

  1. 13 迷人的注册表单设计

    13 迷人的注册表单设计 Gist Gravatar Kontain MOJO-Themes Ning Ping Tumblr Vimeo WordPress Wufoo Better Blogger ...

  2. html注册表单用户体验,入口的用户体验!注册表单的设计技巧

    网上挤满了各种各样的UI设计方案,事实上我们已经有一套套的方案可遵循.但!设计永无止境!哪怕是一个注册表单,也值得再细心研究.下面给出注册表单设计5个小技巧: 1.别让用户重复填写相同的内容 几乎每个 ...

  3. CentOS 初体验二十一:redis常用命令:String

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/79279403 本文出自[赵彦军的博客] 数据类型 Redis支持五种数据类型:st ...

  4. PJAX初体验(主要是利用HTML5 新增API pushState和replaceState+AJAX)

    说在前面 什么是PJAX呢? 站在应用角度的就是既实现了页面无刷新的效果,同时也产生了浏览器的前进和后退,而且url也会变化. 也不是什么新鲜技术,主要是AJAX+html5 pushState和re ...

  5. Web开发(一)·期末不挂之第三章·HTML基础二(html实现表格和表单)

    HTML基础二 一. 表格✪✪✪ 二.表单 插入表单 输入标签✪✪ 多行文本域 下拉菜单 三.其他 label标签 内联框架 一. 表格✪✪✪ 插入表格: < table>< /ta ...

  6. 【项目分享~写给应届生的一篇文章】基于Web企业招聘网站 ~~ 登录注册设计

    背景 适合人群: 应届生 推荐:可直接做为毕业设计项目,开发架构简单,按照统一的规范开发,容易上少 原因:这个项目涉及到SSM三大框架,所以刚刚入门JavaWeb的同学可能不大适合,缺少太多必备的知识 ...

  7. 【项目分享~写给应届生的一篇文章】基于Web企业招聘网站 ~~ 登录注册设计2

    背景 适合人群: 应届生 推荐:可直接做为毕业设计项目,开发架构简单,按照统一的规范开发,容易上少 原因:这个项目涉及到SSM三大框架,所以刚刚入门JavaWeb的同学可能不大适合,缺少太多必备的知识 ...

  8. html 文本框css样式,13种常用按钮、文本框、表单等CSS样式

    虽然CSS样式的学习需要我们动手多实践,需要多做案例,思致思考,但有时候注意资料的收集与整理也是非常重要的,在实际开发中往往会起到事半功倍的效果. 一.按钮样式以下为引用的内容: Example So ...

  9. 【译】 WebSocket 协议第十一章——IANA 注意事项(IANA Considerations)

    概述 本文为 WebSocket 协议的第十一章,本文翻译的主要内容为 WebSocket 的 IANA 相关注意事项. IANA 注意事项(协议正文) 11.1 注册新 URI 协议 11.1.1 ...

最新文章

  1. 对Transformer、XLNet、 ALBERT、 CRF等技术仍然一知半解?再不学习就OUT了!
  2. 科学家发现新的人类脑细胞,或可解答一个难题
  3. 机器人 陆梅东_机器人知识与实践比赛获奖 - 上海徐汇区青少年活动中心
  4. 三菱变频器e700参数表_三菱Q系列PLC,用CCLink控制变频器正反转和多段速
  5. Kafka创建Topic时如何将分区放置到不同的Broker中
  6. 20应用统计考研复试要点(part41)--概率论与数理统计
  7. 演示对sys用户和普通用户进行审计的示例
  8. java8函数式接口_java8的函数式接口
  9. Linux使用I/O复用函数的超时机制的定时器
  10. VS2010+OpenCV2.4.9配置
  11. mongodb查询不等于某个字段_Oracle单表查询多字段,不使用*
  12. AEJoy —— 表达式之弹性(韧性)模拟详解【JS】
  13. 从零开始学习C语言 Day 036
  14. P8843 [传智杯 #4 初赛] 萝卜数据库
  15. App加密那点事浅探爱加密原理
  16. hulu技术宣讲|西安电子科技大学专场
  17. vs 2022连接MySQL数据库
  18. 战地4高性能服务器,战地4服务器推荐配置
  19. knif4j 在线APl 文档测试
  20. 1恢复 群晖raid_群晖raid5数据恢复(一看就会的恢复软件)

热门文章

  1. Python Gstreamer播放rtsp视频流(海康IPCAM)
  2. ERP电商管理系统开发实现功能
  3. Data truncation: Data too long for column 'xxx' at row 1
  4. 单反光圈、快门和感光度的关系
  5. 购买学校计算机房加密狗的请示,2015关于扩建机房的请示.doc
  6. Android 构建简单app 步骤
  7. js自动缩放页面自适应屏幕分辨率
  8. MDS中的caps和Locker
  9. tmp在java中的意思_tmp是什么文件?tmp文件用什么打开?图文讲解
  10. 前端-HTML基础入门