Nodejs:Koa or Express?

Nodejs:Koa or Express?

如果重写一个类 Nodeclub 的项目,基础框架如何选择:

Koa vs. Express

选用 Koa 可以利用 Node harmony 的 generators 特性来写出没有 callback 的代码,但是增加了学习成本,倒不是 generator 的写法,而是新的思维方式,担心会写出不能发挥 harmony 全部潜能的夹生代码

如果使用 Express ,配合 Bluebird ,也可以写出不那么恐怖的流程控制,假如前段使用 Angular.js ,也是使用类似的 Promise 实现,这样写来前后端不存在思维转换的问题

Mongoose vs. Sequelize

这个倒是没多少纠结,就是非关系型数据库(MongoDB)跟关系型数据库(Mysql、MariaDB、PostgreSQL)的选择

本人并没有多少数据库使用经验,而且一向的观点就是够用就行,如果文件数据库(Sqlite、LevelDB)能满足需求就不上需要额外运行服务的数据库。不过个人倾向于后者,如果选用现在大行其道的 MongoDB ,又会纠结于如何设计出符合 NoSQL 理念的数据库


24 回复

Nodejs:Koa or Express?

Koa vs. Express

当你决定重写一个类 Nodeclub 的项目时,选择合适的Web框架至关重要。这里主要讨论两个流行的框架:Koa 和 Express。

1. Koa

Koa 是由 Express 团队开发的一个下一代web框架,它使用了最新的ES6特性如 generators,这使得编写异步代码变得更为简洁。例如:

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
    ctx.body = 'Hello World';
});

app.listen(3000);

然而,使用 Koa 也意味着你需要掌握新的编程范式,即异步编程中的生成器和 async/await。对于开发者来说,这可能需要一些时间去适应。此外,虽然 Koa 提供了更灵活的中间件处理方式,但这也可能增加理解和调试代码的难度。

2. Express

Express 是一个成熟且广泛使用的web框架,它的社区庞大,文档详尽,插件丰富。如果你已经熟悉传统的回调函数或Promise,Express 可以通过结合 Bluebird 等库轻松实现非阻塞的异步代码。例如:

const express = require('express');
const app = express();
const Promise = require('bluebird');

app.get('/', (req, res) => {
    Promise.resolve().then(() => {
        res.send('Hello World');
    });
});

app.listen(3000);

使用 Express 的一大优势在于其稳定性和易用性,特别是对于那些已经习惯于传统回调或Promise风格的开发者来说。此外,Express 生态系统非常丰富,可以轻松找到各种中间件来满足你的需求。

Mongoose vs. Sequelize

关于数据库选择,这取决于你的具体需求。如果你正在处理的是非关系型数据库如 MongoDB,那么 Mongoose 是一个不错的选择。它提供了良好的数据模型定义和验证功能。例如:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true });

const UserSchema = new mongoose.Schema({
    name: String,
    age: Number
});

const User = mongoose.model('User', UserSchema);

// 创建新用户
const newUser = new User({ name: 'John Doe', age: 30 });
newUser.save();

另一方面,如果你需要处理关系型数据库如 MySQL 或 PostgreSQL,Sequelize 是一个很好的选择。它支持复杂的查询和事务管理。例如:

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

const User = sequelize.define('User', {
    name: {
        type: DataTypes.STRING,
        allowNull: false
    },
    age: DataTypes.INTEGER
});

(async () => {
    await sequelize.sync();
    const user = await User.create({ name: 'Jane Doe', age: 25 });
})();

总之,选择 Koa 还是 Express,取决于你对新技术的接受程度以及团队的技术栈。而 Mongoose 和 Sequelize 则分别适用于不同的数据库类型。


bluebird挺好的,通过promisifyAll和第三方模块也非常容易集成。 另外bluebird准确地说只是Promise Library而不是流程控制模块

建议使用koa,我们公司现在生产环境上的项目已经是用koa来写了,如果要用koa重写加我一个

业余项目必然koa啊

:-O 我支持koa。

koa之后,再无express。特别是koa实现了真正意义上的middleware,如果大家写过connect或者express的中间件,有一些需求不通过hack方式是无法实现的。

未来趋势是越来越多库支持promise,那么它默认就是对koa友好的,无需再写一个co wrapper了

我昨天已经用 Express搭了一个框架,看了大家的评论,决定就用 Koa 吧,其实我之前主要担心的是前后端的思维不一致,现在浏览器端也就 Firefox 支持 generator,使用 Node.js 的一个很大的原因就是前后端的一致性,不知道到什么时候才会实现主流平台的全面支持

至于数据库,Sequelize 基于 Promise 的 2.0 版本还处于 unstable 阶段,api 处于随时可变的阶段,所以还是继续使用 Mongoose 吧

我想用express 但是被强迫用koa了

全线koa,感觉不错。新手慎入。

可以试试 Nokit , nokit.org

哪个熟悉用哪个

既然你都用 Bluebird/Promise 了,Koa 的 yield 也支持使用 Promise 了,而且语法和 ES7 async/await 很接近

来试试AgentK (https://github.com/kyriosli/agentk),最优雅的异步处理方式就是没有异步

可以关平吗。。

请问一下koa中是怎么样将数据库操作、逻辑处理和页面显示分开的那?目前了解到的是这样实现的,都是混在一起的,router.get(’/’, function *(next) { var rows = yield dbHandle.db.query(‘select * from account where studio=?’,[‘全部’]); yield this.render(‘get’, { title: rows[0].userName }); });

make<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>

make<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>

make<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>

make<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>

make<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>

make<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>

针对 “Nodejs: Koa or Express?” 这个问题,我们可以从几个角度来讨论这两个框架的特点以及各自的适用场景。

Koa vs. Express

Koa

Koa 是由 Express 团队开发的新一代 Web 框架,它主要的目标是通过使用 ES6 的 generators 来简化回调地狱,并提供更轻量级的中间件系统。以下是一个简单的 Koa 应用示例:

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
    ctx.body = 'Hello World';
});

app.listen(3000);

Express

Express 是一个成熟的 Web 框架,提供了强大的路由功能和丰富的中间件生态系统。如果你已经熟悉了回调函数或者 Promise,Express 将会是一个更易上手的选择。以下是使用 Express 的简单示例:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('Hello World');
});

app.listen(3000);

前后端一致性

如果你的前端使用的是基于 Promise 的框架(如 Angular.js),那么在服务器端也使用类似的概念可以保持一致性,减少思维上的转换。对于 Express,你可以通过结合如 bluebird 这样的库来处理异步操作:

const Promise = require('bluebird');
const express = require('express');

const app = express();

app.get('/', async (req, res) => {
    await Promise.delay(1000); // 模拟异步操作
    res.send('Hello World');
});

app.listen(3000);

结论

选择 Koa 还是 Express 主要取决于你的团队熟悉度和技术栈的一致性。如果你对 generators 感兴趣,并希望尝试一种新的编程范式,Koa 是一个不错的选择。但如果你寻求快速启动并拥有大量的中间件支持,Express 则更为合适。

回到顶部