GithubHelp home page GithubHelp logo

lfb / nodejs-koa-blog Goto Github PK

View Code? Open in Web Editor NEW
1.8K 40.0 453.0 41.54 MB

基于 Node.js Koa2 实战开发的一套完整的博客项目网站

Home Page: https://www.boblog.com

License: MIT License

JavaScript 97.72% EJS 2.28%
koa2 vue mysql koa vuejs koa2-vue nodejs nuxtjs nuxtjs-project element-ui

nodejs-koa-blog's Introduction

logo

一、项目介绍

我们这个项目就是完成一个完整的博客项目,包含服务端接口API,管理后台,前端网站,以及部署上线流程。为了项目更好的区分,这个项目主要介绍使用 Node.js Koa2 框架开发一套完整的服务端接口 API 项目,另外的项目请点击以下:

1.1.项目模块

使用精小而强大的 Node.js Koa2 框架做服务端 API 接口,非常适合想用 Node.js Koa2 做服务的朋友,相信你一定能学到知识。

  • 管理员模块
    • 实现权限管理,能够对其他模块进行增删改查权限
    • 登录注册模块,登录管理后台
  • 用户模块
    • 实现在前台博客网站中登录注册
  • 文章模块
    • 实现文章的新增,修改,删除,查询
    • 文章进行对分类,评论,回复关联
  • 分类模块
    • 实现分类的新增,修改,删除,查询
    • 实现分类与文章进行关联
  • 评论 / 回复模块
    • 实现评论 / 回复的新增,修改,删除,查询
    • 实现评论 / 回复与文章进行关联

1.2.接口文档

记录和完善接口文档是一个良好的习惯,接口文档放在 doc 目录下,比如管理员的接口文档:https://github.com/lfb/nodejs-koa-blog/blob/master/doc/admin.md

1.3.项目展示

二、使用项目

2.1.克隆项目

首先使克隆项目,然后进入项目根目录使用命令安装包,最后命令启动项目,代码会根据模型自动创建数据库表的。

# 克隆项目代码

git clone https://github.com/lgb/nodejs-koa-blog.git

2.2.项目架构

拉取代码下来后,简单说明一下项目架构,我们简单熟悉一下,目的是为了了解清楚每个文件夹有什么作用的,好的代码结构并不仅仅是为了看上去清晰,它更像是我们对一个系统的拆解和组装。

.
├── _tests 单元测试
├── app *重点, 项目工程入口
    ├── api 接口
    ├── dao 数据存取对象(Data Access Objects)
    ├── lib 工具库
    ├── models 建模,把业务逻辑映射成数据模型
    ├── service 数据处理
    └── validators 数据验证
├── app.js 入口文件
├── config 配置文件
├── core 核心公共工具库
├── doc 接口文档
├── jest.config.js  测试配置文件
├── middlewares 中间件
├── package-lock.json
├── package.json
└── yarn.lock

2.3.创建数据库

启动项目前一定要在创建好 boblog 数据库,如果你还没安装上数据库,请点击MySQL 下载,请在根目录下的 |——config/config.js 文件下修改您本地的数据库名字(boblog)和数据库密码 ( password )。以下是执行数据库命令:

# 登录数据库

mysql -uroot -p (回车然后输入你的本机数据库密码)

# 创建 boblog 数据库

CREATE DATABASE IF NOT EXISTS boblog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2.4.启动项目

以下是启动服务端项目的操作命令:

# 进入项目根目录

cd nodejs-koa-blog

# 安装依赖包

npm install 或者 yarn install

# 启动 Node.js Koa2 项目

npm run dev 或者 yarn dev

API 端口默认是 5000,打开浏览器输入回车:http://localhost:5000 可以看到浏览器返回数据,可以查看目录下的 ./app/api/v1 下的接口或者看 doc 目录下的 markdown 接口文档,在 postman 测试接口。

Postman 下载地址:https://www.postman.com/downloads/

三、FAQ

  1. 没有yarn环境,npm 可以吗?

答:可以的,建议使用 yarn,yarn 比 npm 速度快,主要是安装版本统一。

  1. 启动 Koa2 项目报错,请问原因?

答:首先,请检查一下使用 npm 或 yarn 安装依赖包没。然后,再请检查一下确保安装好数据库,新建好数据库:boblog,请看上面的数据库配置。最后看下启动打印日志是否有报错的信息。

  1. ... 更多问题请到 Issues查阅,或者有问题请到 Issues 提问

License

MIT, by LFB

喜欢或对你有帮助的话,请你点一个星星 star 鼓励我,或者您有更好的建议和意见,请提出来告知我,可以留言 Issues。希望能够帮助到你学习!Thanks!共勉!

nodejs-koa-blog's People

Contributors

lfb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nodejs-koa-blog's Issues

可能是我自己的问题,因为新学这些东西可能有地方完全不明白。

可能是我自己的问题,因为新学这些东西可能有地方完全不明白。
我现在可以打开8080和8083,3000这个注册页面找不到~~~
数据库没啥问题~~
SX@JV5IUYV3_P{_@W$MS%7F

Originally posted by @tenderzada in #26 (comment)

这个没有问题,因为'/'没有绑定任何东西,所以是404,只要借口可以访问就没问题,输出的是sequelize调试的信息,如果项关闭,需要在db.js中给logging设置为false。祝你顺利!

项目启动加载问题,一直卡在插入数据库命令哪里

Executing (default): CREATE TABLE IF NOT EXISTS comments (id INTEGER auto_increment , nickname VARCHAR(255), email VARCHAR(255), content TEXT, article_id VARCHAR(255)
, parent_id INTEGER DEFAULT 0, created_at DATETIME, updated_at DATETIME NOT NULL, deleted_at DATETIME, PRIMARY KEY (id)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM comments

项目 用npm run dev 这个命令之后,就开始插入数据库 , 但是就一直卡上面这串代码上,

const apiDirectory = `${process.cwd()}/app/api`

/core/init.js 的第 16行

static initLoadRouters() {
// 绝对路径
const apiDirectory = `${process.cwd()}/app/api`

我放到服务器上部署的时候, 这里会报错, 后面我改成 相对路径 ../app/api 就好了

可以说下 这里为啥要用绝对路径吗?

运行 npm run dev 报错,本地建立的有boblog数据库

运行 npm run dev 报错,本地建立的有boblog数据库

SEQUELIZE0002] DeprecationWarning: The logging-option should be either a function or false. Default: console.log
Unhandled rejection SequelizeConnectionError: Client does not support authentication protocol requested by server; consider upgrading MySQL client
at /Users/edz/nodejs-koa-blog/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:133:19
at tryCatcher (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/promise.js:547:31)
at Promise._settlePromise (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/promise.js:725:18)
at _drainQueueStep (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/async.js:93:12)
at _drainQueue (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/async.js:86:9)
at Async._drainQueues (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/async.js:102:5)
at Immediate.Async.drainQueues [as _onImmediate] (/Users/edz/nodejs-koa-blog/node_modules/bluebird/js/release/async.js:15:14)
at processImmediate (internal/timers.js:439:21)

sequelize结构

您好 想问一下关于使用sequelize 中的目录结构 module目录 schema目录
这两个目录作用没有弄清楚啥意思

npm run dev 报错

(node:38871) [SEQUELIZE0002] DeprecationWarning: The logging-option should be either a function or false. Default: console.log
events.js:183
throw er; // Unhandled 'error' event

'nodemon' ▒▒▒▒▒ڲ▒▒▒▒ⲿ▒▒▒Ҳ▒▒▒ǿ▒▒▒▒еij▒▒▒ ▒▒▒▒▒▒▒▒▒ļ▒▒▒ npm ERR! code ELIFECYCLE npm ERR! errno 1

0 info it worked if it ends with ok
1 verbose cli [ 'F:\nodejs\node.exe',
1 verbose cli 'F:\nodejs\node_modules\npm\bin\npm-cli.js',
1 verbose cli 'run',
1 verbose cli 'dev' ]
2 info using [email protected]
3 info using [email protected]
4 verbose run-script [ 'predev', 'dev', 'postdev' ]
5 info lifecycle [email protected]predev: [email protected]
6 info lifecycle [email protected]
dev: [email protected]
7 verbose lifecycle [email protected]dev: unsafe-perm in lifecycle true
8 verbose lifecycle [email protected]
dev: PATH: F:\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin;D:\jsSpace\rent-house\nodejs-koa-blog\node_modules.bin;C:\Users\zhr\bin;F:\Git\mingw64\bin;F:\Git\usr\local\bin;F:\Git\usr\bin;F:\Git\usr\bin;F:\Git\mingw64\bin;F:\Git\usr\bin;C:\Users\zhr\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;F:\JAVA\jdk1.8.0\bin;F:\JAVA\jdk1.8.0\jre\bin;%CATALINA_HOME%\bin;%CATALINA_HOME%\lib;F:\JAVA\apache-maven\bin;F:\nodejs;F:\Git\cmd;F:\Go\bin;F:\Geth;F:\Python27;F:\MATLAB\R2019a\bin;F:\TDM-GCC-64\bin;F:\Python27;C:\Users\zhr\AppData\Local\Microsoft\WindowsApps;C:\Users\zhr\AppData\Local\atom\bin;C:\Users\zhr\AppData\Roaming\npm;C:\Users\zhr\go\bin;F:\JetBrains\CLion 2018.3.3\bin;F:\Git\usr\bin\vendor_perl;F:\Git\usr\bin\core_perl
9 verbose lifecycle [email protected]dev: CWD: D:\jsSpace\rent-house\nodejs-koa-blog
10 silly lifecycle [email protected]
dev: Args: [ '/d /s /c', 'nodemon app.js' ]
11 silly lifecycle [email protected]dev: Returned: code: 1 signal: null
12 info lifecycle [email protected]
dev: Failed to exec dev script
13 verbose stack Error: [email protected] dev: nodemon app.js
13 verbose stack Exit status 1
13 verbose stack at EventEmitter. (F:\nodejs\node_modules\npm\node_modules\npm-lifecycle\index.js:301:16)
13 verbose stack at emitTwo (events.js:126:13)
13 verbose stack at EventEmitter.emit (events.js:214:7)
13 verbose stack at ChildProcess. (F:\nodejs\node_modules\npm\node_modules\npm-lifecycle\lib\spawn.js:55:14)
13 verbose stack at emitTwo (events.js:126:13)
13 verbose stack at ChildProcess.emit (events.js:214:7)
13 verbose stack at maybeClose (internal/child_process.js:915:16)
13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
14 verbose pkgid [email protected]
15 verbose cwd D:\jsSpace\rent-house\nodejs-koa-blog
16 verbose Windows_NT 10.0.14393
17 verbose argv "F:\nodejs\node.exe" "F:\nodejs\node_modules\npm\bin\npm-cli.js" "run" "dev"
18 verbose node v8.12.0
19 verbose npm v6.4.1
20 error code ELIFECYCLE
21 error errno 1
22 error [email protected] dev: nodemon app.js
22 error Exit status 1
23 error Failed at the [email protected] dev script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 1, true ]

上线部署

老师你好,请问这个项目后台部署上线流程是怎样的 vue项目上线可以npm run build 打包然后把打包的文件放在服务器上,nodejs的后台上线是怎样的流程?第一次接触nodejs,老师有空的时候能帮忙解答下吗。感谢

强制同步问题

// core/db.js
sequelize.sync({
    force: false
})
``
这么写不会导致原来的数据丢失吗?

富文本编辑器

富文本编辑器上传图片之后,图片在文章里面没发显示

关于部署环境

请问大佬,这个项目只能部署在linux环境下是吗?
我在windows环境下 启动web 报错

实现文章的新建和查询

大佬你好,我看了你写的KOA2从0搭建实现文章的新建和查询
代码按照文章中的复制粘贴进去之后
image
打断点运行发现ctx的内容里面没有body 导致后面的程序出错。
请问一下这个需要怎么处理?

POST /v1/admin/register 注册管理员失败

POST : http://localhost:3000/v1/admin/register?nickname=�klimt&password1=12345_abAB&password2=12345_abAB&[email protected]
返回消息如下:
"msg": [
"WHERE parameter "email" has invalid "undefined" value"
],
"error_code": 10000,
"request": "POST /v1/admin/register"

从代码来看,LinValidator._check这个函数在走到isCustomFunc分支时,this.data还是未定义的无效值,并没有更新为传入的email值,所以会报异常。

1

大佬能不能上传一份到码云啊,github上拉取代码太慢了

大佬怎么学习sequelize

学习sequelize就看文档吗?感觉api好多记不住,前端新手,不太会实际应用。该怎么学习呢

npm start 启动报错

npm start 启动报错,报错信息是不能加入有约束的外键

koa deprecated Support for generators will be removed in v3. See the documentation for examples of how to convert old middleware https://github.com/koajs/koa/blob/master/docs/migration.md app.js:18:5
Executing (default): CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER(11) NOT NULL auto_increment , `username` VARCHAR(50) NOT NULL, `password` VARCHAR(255) NOT NULL, `createdAt` DATETIME, `updatedAt` DATETIME, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): CREATE TABLE IF NOT EXISTS `article` (`id` INTEGER auto_increment , `title` VARCHAR(255) NOT NULL, `author` VARCHAR(255) NOT NULL, `recommend` TINYINT(1) NOT NULL DEFAULT false, `introduce` VARCHAR(255) NOT NULL, `category` VARCHAR(255) NOT NULL, `banner` VARCHAR(255) NOT NULL, `content` TEXT NOT NULL, `browser` INTEGER DEFAULT 0, `createdAt` DATETIME, `updatedAt` DATETIME, `categoryId` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`categoryId`) REFERENCES `category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
Executing (default): CREATE TABLE IF NOT EXISTS `category` (`id` INTEGER auto_increment , `name` VARCHAR(50) NOT NULL, `createdAt` DATETIME, `updatedAt` DATETIME, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Unhandled rejection SequelizeDatabaseError: Cannot add foreign key constraint
    at Query.formatError (/Users/Leo/my/projects/test/nodejs-koa2-mysql-sequelize-jwt/node_modules/sequelize/lib/dialects/mysql/query.js:247:16)
    at Query.handler [as onResult] (/Users/Leo/my/projects/test/nodejs-koa2-mysql-sequelize-jwt/node_modules/sequelize/lib/dialects/mysql/query.js:68:23)
    at Query.Command.execute (/Users/Leo/my/projects/test/nodejs-koa2-mysql-sequelize-jwt/node_modules/mysql2/lib/commands/command.js:30:12)
    at Connection.handlePacket (/Users/Leo/my/projects/test/nodejs-koa2-mysql-sequelize-jwt/node_modules/mysql2/lib/connection.js:502:28)
    at PacketParser.onPacket (/Users/Leo/my/projects/test/nodejs-koa2-mysql-sequelize-jwt/node_modules/mysql2/lib/connection.js:81:16)
    at PacketParser.executeStart (/Users/Leo/my/projects/test/nodejs-koa2-mysql-sequelize-jwt/node_modules/mysql2/lib/packet_parser.js:77:14)
    at Socket.<anonymous> (/Users/Leo/my/projects/test/nodejs-koa2-mysql-sequelize-jwt/node_modules/mysql2/lib/connection.js:89:29)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)
    at Socket.Readable.push (_stream_readable.js:208:10)
    at TCP.onread (net.js:597:20)

Executing (default): SHOW INDEX FROM `user`
Executing (default): SHOW INDEX FROM `category`

post 验证 bug

// 管理员注册
router.post('/register', async (ctx) => {
// 通过验证器校验参数是否通过
const v = await new RegisterValidator().validate(ctx);

验证器默认会验证query和body等全部参数,
当将参数放到params时,验证器也可以通过验证,
没有针对ctx.body作限制

有无好的实现方式

从90多个star一直关注到现在的433个

看着楼主大神的不断进步,很是崇拜,也一直在跟着你的项目一直在学习。
注意到好像重构了,跟之前的代码完全不一样了。
现在疑惑的地方有三个,大神能给我讲讲吗?
1.require-directory 自动路由加载 这个是体现在哪里?
2.看文档里token需要base64转码了? 之前的token在代码里都是前面加“bearer:”就行
3.关于验证器这块有相关的文章吗?直接看代码的话有点看不懂
多谢!

数据库的问题

Unhandled rejection SequelizeConnectionError: Client does not support authentication protocol requested by server; consider upgrading MySQL client

请问这个问题 我在网上查了一下是数据库版本的问题,老哥你的数据库是那个版本?

文章阅读量算法?

你好兄弟,你是在计算文章阅读量的时候直接给加一了,意思说用户每次刷页面都给加一是吧?node+koa2里面有没有更好的方法不让用户每次刷页面加一?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.