刚做完的MERN Project,一些tips

438 阅读3分钟

对于任何一个有form(register, createProfile 一行一行的)的Component,提前写好一个onChange函数,对于form里的任何一行东西只要触发onChange,React Component 的state对应的变量就会改变

点击Submit按钮会调用onSubmit函数,调用 createProfile/register这些个 action,把Component里面的formData都传到action里 ,action用这些formData去做post,如果成功,就dispatch REGISTER_SUCCESS,相应的reducer会改变state里面的profile/auth 数据,有了数据,我们就可以在component里编写layout把这些数据漂亮的展示出来了;如果失败,就dispatch REGISTER_FAIL,相应的reducer会先把errors一个个alert出来(call setAlert),然后把erros放到state 里

1. JSON Web Token

用于用户认证,为了代替session,把用户数据都保存在客户端。

用户登录,服务器认证后生成一个JWT发回给用户,用户把JWT存到localStorage(或cookie)里面。从此客户端每一次与服务器通信,都要带上这个JWT。

为什么用JWT代替session?

使用session时对服务器集群和跨域服务的架构影响很大。因为cookie是不支持跨域的,如果是集群,就要共享session数据,让每台服务器都能读取session。

为了解决这个问题,我们引入JWT。用户信息都存储在前端,服务器就不需要存储session了,不管是跨域还是集群的,都能获取用户信息。

JWT三部分

1)Header:JSON对象,有签名的算法alg和token 类型 typ

2)Payload:JSON对象,存放实际需要传递的数据。有官方字段 iat exp… 可存放私有字段 “user”: { “id”: “nlnlknkn”}

  1. Signature: 对前两部分的签名,防止用户篡改数据。

我写了一个middleware,每次调用API的时候(GET, POST,等等)都带上这个middleware,把JWT解析成req.user.id给组件使用

2. Redux

Store: 存放state

Action: 在React Component里call action, 做HTTP request,根据不同的结果 dispatch 到不同的reducer

Reducer:根据action返回的类型,return 不同的state(如果成功,把payload放进state的相应位置;如果失败,把payload(一般是error的信息)写到state里面的error object)

a. Private route :

在 Dashboard, createProfile, EditProfile 这些Route,我都加上了PrivateRoute。在redux state的auth里有isAuthenticated,如果isAuthenticated, 如果是true就去普通的dashboard/profile/createProfile… component;如果是false,就redirect到login

  1. 用react 和 redux 做一个页面的过程:

1)(先处理好state): 先写action和reducer ,确保在页面上call action的时候此页面能获取到state里的相应信息

2)(再写component): 再根据获得的state里的信息,把它们呈现到页面上,做到美观

3. Responsive design

  • 在css里创建一个className叫.hide-sm,当宽度低于某个值时就display:none
  • 百分比布局
  • rem布局
  • 设置meta标签
  • media query + 条件判断 

4. React

a. 其实所有真正去到的route都是在App.js里定义的,backend里的route只是用来做http request

b. Hook

1) useState,当这个component 里有一个表格,我们需要component level state 来维护这个表格里的信息

2) useEffect,当我们需要一加载到这个component就需要get 点什么的时候(getProfile(s), getPost(s)),需要useEffect,就像componentDidMount一样

c. showActions

在PostItem.js,加一个 showActions,在Posts的页面使用PostItem这个组件时设成true(这是default),点赞评论那一行显示;在单独的post页面也使用PostItem这个component,不过showActions设成false,那一行不显示

5. Express & Node.js

用 Express & Node.js 创建服务器。

1. 创建路由处理器。HTTP动词,路径,中间件,回调函数。

2. 使用中间件。创建中间件auth,为特定的HTTP动词和路由添加该函数。

3. 错误处理。res.status(500).send('Server Error')。

4. 使用数据库。连接MongoDB,在数据库进行增删改查。

小tips:

1)Express-validator里面的check 和 result 检查 post的时候 body里面json格式内容是否有效

2)用 bcrypt 里面的salt和hash 对用户密码进行encrypt