后端程序员使用 react+koa+mongodb+redis 开发个人技术博客,欢迎 star,欢迎 fork,一起学习 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oyosc

后端程序员使用 react+koa+mongodb+redis 开发个人技术博客,欢迎 star,欢迎 fork,一起学习

  •  
  •   oyosc 2018 年 8 月 29 日 4876 次点击
    这是一个创建于 2795 天前的主题,其中的信息可能已经有所发展或是发生改变。

    react+koa+mongodb+redis 个人技术博客(博客地址: 博客地址)

    说明:

    • 借鉴项目:React-Express-Blog-Demo,基础比较弱的可以先看下这个项目,说的比较详细,由于比较偏后端,所以前端这块改动的不多,主要是后端的一些改动,后面会依次贴出代码改动以及所遇到的一些问题跟解决方案

    改动基本介绍,相关代码会贴出来并主要说一下:

    项目结构介绍,只涉及后端,前端基本没啥改动,不懂得可以看下我借鉴的项目

    api 接口整理

    前端

    前端后台评论管理功能

    • 这里跟别的文章管理没什么区别,主要的问题就在于 columns 这个数组对象需要放在组件里,否则无法获取 this 对象以及对应的 props,另外 antd 库,在使用 switch 组件的时候 defaultChecked 在面对 Pagination 换页时会出现状态无法更改,还是显示上一页的状态,这里需要使用 checked 属性,具体代码以及说明

    前端第三方 github 登录功能

    • github 第三方登录在 react 上这种单页面实现的时候,会出现跨域问题,这里的话有两种解决办法,具体代码以及解决办法

    前端文章评论功能

    • 这块是通过我上文所借鉴项目里的教程开发的,样式的话是采用 github 的 issue 结构,具体代码位于 blog/app/containers/comment 文件夹里,这里就不细说了,唯一需要注意的就是在评论或者点赞的时候需要更新 react state

    后端

    后端框架修改

    • 将框架由 express 改成了 koa2,具体的中间件的话可以查看 blog/server/api/apiServer.js

    token+session 功能

    • 在后台中间件这里新增了 token 中间件(检测 token)跟 admin 中间件(检测是否为 admin),这里 token 中间件的处理流程是先检测请求路径是否需要验证 token,如果需要则检测其请求头上的 authorization 字段,满足的话进入路由,并且在结束后在其响应头上将 token 值添加到 Authorization 字段,这里如果前后端采用不同的端口会产生跨域问题,具体代码以及解决方案

    后端数据库字段更改跟表添加

    • 这里就一些表字段更改就表添加,唯一需要注意的是 mongoose.model 这个方法在表名没有 s 的时候会自动加上,另外使用了 mongodb 的 aggregate,pipeline 等,具体代码以及方案

    单元测试以及代码检查

    • 单元测试这里用的是 jest,原因的话主要由于它内嵌了断言等,并且支持 react,代码位于 blog/test 文件夹,目前只写了登录的测试接口,后面有时间再加上,代码检查的话采用的是 eslint 库,extends standard,后面加了一些自己的规则

    log 模块

    • 这里在网上其实有别的方式来定义一个全局的错误变量,但是很可惜的是在 es5 里已经不再支持,这里我采用的是定义一个全局函数,当调用它的时候会产生一个错误,再通过正则来获取所在的代码行号跟文件信息,具体代码

    环境

    react @16.3.1 react-router @4.2.0 node @8.9.1 mongodb @4.0.2 webpack @4.4.1 

    运行

    git clone https://github.com/oyosc/blog

    npm install

    npm run start-prod

    独立打包

    npm run build

    pm2 方式启动

    npm install pm2 -g

    pm2 -i max start npm -- run start-prod-debug(这里的命令可以查看 package.json 文件)

    开发数据库文件

    地址: https://pan.baidu.com/s/1oLyvpJ3gwcgvTmSAjn9OJA 密码: bv1c

    从零开始搭建项目

    感兴趣的请移步我的博客

    TODO

    • 后面有时间打算把推送也实现下,至于其他的再看吧,另外我个人在获取评论是否需要审核的时候,因为是直接从后端获取,这样会产生页面上会显示默认的审核状态,原因的话应该是 react state 还未生成,个人觉得可以用个定时器来实现,不知道还有没有别的解决办法

    more

    • 由于一直是做后端程序员,所以搞起前端来感觉很麻烦,有问题什么的请提 issue,有时间的话会回答的,最后欢迎 star,欢迎 fork,大家一起学习
    第 1 条附言    2018 年 8 月 30 日

    github地址,求一波star跟fork,谢谢

    2 条回复    2018-08-30 09:48:21 +08:00
    ericls
        1
    ericls  
       2018 年 8 月 29 日 via iPhone
    关于你的 todo, 一般 optimistic update 以后 还是要根据后端返回再 update 一次的
    oyosc
        2
    oyosc  
    OP
       2018 年 8 月 30 日
    @ericls 找到原因了,switch 组件中开始使用的是 defaultChecked(这个属性貌似有一些问题),换成 checked 就好了
    关于     帮助文档     自助推广系统     博客     API         Solana     881 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 22:03 PVG 06:03 LAX 15:03 JFK 18:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86