起因
看到simple todo的各种python版本实现, 我也来凑凑热闹…
既然已经有这么多python版本了, 我就对比实现了一个Simple-TODO的nodejs版本: Node TODO, 模版和樣式全部copy自web.py版本.
Source Code && Demo
- 源代码: https://github.com/fengmk2/todo
- 在线demo: http://api.yongwo.de:3888
代码目录
目录还是很清晰的, public存放静态文件, views存放模版, controllers处理业务逻辑,
还有配置config.js, web主入口server.js
使用到的第三方nodejs模块
- express: Web框架, 目前nodejs使用最广泛的web框架
- ejs: 模版渲染引擎, 用于生成动态内容
- node-mysql: 纯javascript实现的mysql驱动, 无法安装任何mysql包依赖.
这3个模块都可以直接通过npm安装获得:
$ npm install express ejs mysql
开发过程记录
config.js
可配置的信息:
* 网站名称
* 监听端口号, 默认8080
* 数据库配置信息
如何访问数据库
在config.js文件里面, 会使用一下方式保持着数据库的链接对象
var db = exports.db = new require(‘mysql’).Client(db_options);
db.connect(function(err) {
if(err) {
console.error('connect db ' + db.host + ' error: ' + err);
process.exit();
}
});
这样我们就可以在别的地方直接使用db对象了
server.js
express可以帮我们默认实现了静态文件处理, cookie处理, 请求参数处理等事情, 只需要配置一下, 就可以使用上这些功能了.
var app = express.createServer();
app.use(express.static(__dirname + '/public’, {maxAge: 3600000 * 24 * 30}));
app.use(express.cookieParser());
app.use(express.bodyParser());
同样, 需要配置模版渲染引擎为ejs
app.set("view engine", “html”);
app.set("views", _dirname + ‘/views’);
app.register("html", ejs);
看看views/index.html里面的一个最复杂的模版例子,
ejs最让我喜欢的是不用再学一套语法, 直接是内嵌js, 还是很容易读懂的
URL Routing与Controllers
一个http请求过来, 由那个controller处理, express提供了简便的routing方式
app.get('/’, todo.index);
app.post('/todo/new’, todo.new);
app.get('/todo/:id’, todo.view);
app.get('/todo/:id/edit’, todo.edit);
app.post('/todo/:id/edit’, todo.save);
app.get('/todo/:id/delete’, todo.delete);
app.get('/todo/:id/finish’, todo.finish);
如添加一条todo记录: HTTP GET /new, 将由todo.new方法处理,
代码逻辑包括了title参数有效性验证, 数据保存到数据库, http redirect:
exports.new = function(req, res, next) {
var title = req.body.title || '’;
title = title.trim();
if(!title) {
return res.render('error’, {message: '标题是必须的’});
}
db.query('insert into todo set title=?, post_date=now()', [title], function(err, result) {
if(err) return next(err);
res.redirect(‘/’);
});
};
更多的controller处理逻辑请查看/controllers/todo.js.
数据库初始化及启动Web进程
$ mysql xxx
$ source ~/todo/todo.sql
$ node server.js
有爱
可以看到, 无论是python的web开发, 还是nodejs, 我们以前对web的概念还是无需改变的.
都是我们熟悉的一些关键词:
http, request, response, html, template engine, url routing, MVC, GET, POST, MYSQL, Database…
不同的是, 这里只使用javascript就可以驱动着以上的一切.
希望本文对你有用 ^^
lingzuer@ubuntu:~$ npm install express
npm ERR! Unsupported
npm ERR! Not compatible with your version of node/npm: [email protected]
npm ERR! Required: {"node":">= 0.4.1 < 0.5.0"}
npm ERR! Actual: {"npm":"1.0.15","node":"v0.5.2-pre"}
npm ERR!
npm ERR! System Linux 2.6.38-10-generic
npm ERR! command “node” “/usr/local/bin/npm” “install” “express”
npm ERR! cwd /home/lingzuer
npm ERR! node -v v0.5.2-pre
npm ERR! npm -v 1.0.15
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/lingzuer/npm-debug.log
npm not ok
求稍微详细些的代码部署教程。
我在ubuntu上已经安装了nodejs、npm 以及express ejs mysql这些包,
并将config.js中的配置信息改为了我数据库对应的配置信息,
并且也在mysql中创建了数据库,但是运行 node server.js报错:
Error: deprecated: use mysql.createClient() instead
at Object.Client (/home/pulee/node/node_modules/mysql/lib/client.js:12:11)
at Object. (/home/pulee/node/todo/config.js:16:44)
at Module._compile (module.js:402:26)
at Object…js (module.js:408:10)
at Module.load (module.js:334:31)
at Function._load (module.js:293:12)
at require (module.js:346:19)
at Object. (/home/pulee/node/todo/server.js:4:14)
at Module._compile (module.js:402:26)
at Object…js (module.js:408:10)
将错误中提到的函数替换后,错误变为:
Error: deprecated: connect() is now done automatically.
at Client.connect (/home/pulee/node/node_modules/mysql/lib/client.js:40:9)
at Object. (/home/pulee/node/todo/config.js:17:4)
at Module._compile (module.js:402:26)
at Object…js (module.js:408:10)
at Module.load (module.js:334:31)
at Function._load (module.js:293:12)
at require (module.js:346:19)
at Object. (/home/pulee/node/todo/server.js:4:14)
at Module._compile (module.js:402:26)
at Object…js (module.js:408:10)
求指点,万分感谢!
将config.js 从16行开始修改成一下代码
var mysql = new require(‘mysql’), db = null;
if(mysql.createClient) {
db = mysql.createClient(db_options);
} else {
db = new mysql.Client(db_options);
db.connect(function(err) {
if(err) {
console.error('connect db ' + db.host + ' error: ' + err);
process.exit();
}
});
}
exports.db = db;
[…] Jscex的主要使用场景是“JavaScript异步编程”,不过并没有限制是跑在浏览器还是服务器端。最近Node.js很火热,也刚发布了原生的Windows版,不少同学会用它来做一些网站这样的小程序。目前用Node.js开发网站最著名的框架是Express,使用起来也是比较容易的。前段时间看到CNodeJS社区的一篇文章,有同学将一个Python写的ToDo列表网站移植到了Node.js上,我为了推广Jscex,就fork了这个项目,将其修改为基于Jscex的版本,大伙儿可以来比较一下。当然这个网站过于简单,我也正在寻找更合适的项目。 […]
[…] Jscex的主要使用场景是“JavaScript异步编程”,不过并没有限制是跑在浏览器还是服务器端。最近Node.js很火热,也刚发布了原生的Windows版,不少同学会用它来做一些网站这样的小程序。目前用Node.js开发网站最著名的框架是Express,使用起来也是比较容易的。前段时间看到CNodeJS社区的一篇文章,有同学将一个Python写的ToDo列表网站移植到了Node.js上,我为了推广Jscex,就fork了这个项目,将其修改为基于Jscex的版本,大伙儿可以来比较一下。当然这个网站过于简单,我也正在寻找更合适的项目。 […]