nodejs web开发入门: Simple-TODO Nodejs 实现版
发布于 13 年前 作者 fengmk2 40056 次浏览 最后一次编辑是 8 年前

<h2>起因</h2> <br/>看到<a href=“http://simple-is-better.com/news/tag/simple-todo”>simple todo的各种python版本实现</a>, 我也来凑凑热闹… <br/>既然已经有这么多python版本了, 我就对比实现了一个Simple-TODO的nodejs版本: <a href=“https://github.com/fengmk2/todo”>Node TODO</a>, 模版和樣式全部copy自web.py版本. <br/><h2>Source Code && Demo</h2> <br/><ul> <br/> <li>源代码: <a href=“https://github.com/fengmk2/todo”></a><a href=“https://github.com/fengmk2/todo”>https://github.com/fengmk2/todo</a></li> <br/> <li>在线demo: <a href=“http://api.yongwo.de:3888/”></a><a href=“http://api.yongwo.de:3888”>http://api.yongwo.de:3888</a></li> <br/></ul> <br/><img src=“http://ww3.sinaimg.cn/large/6cfc7910jw1diwdadumcwj.jpg” alt=“http://ww3.sinaimg.cn/large/6cfc7910jw1diwdadumcwj.jpg” /> <br/><h2>代码目录</h2> <br/>目录还是很清晰的, public存放静态文件, views存放模版, controllers处理业务逻辑, <br/>还有配置config.js, web主入口server.js <br/> <br/><img src=“http://ww1.sinaimg.cn/large/6cfc7910jw1dix4wp92nmj.jpg” alt=“代码目录” /> <br/><h2>使用到的第三方nodejs模块</h2> <br/><ul> <br/> <li><a href=“http://expressjs.com/”>express</a>: Web框架, 目前nodejs使用最广泛的web框架</li> <br/> <li><a href=“https://github.com/visionmedia/ejs”>ejs</a>: 模版渲染引擎, 用于生成动态内容</li> <br/> <li><a href=“https://github.com/felixge/node-mysql”>node-mysql</a>: 纯javascript实现的mysql驱动, 无法安装任何mysql包依赖.</li> <br/></ul> <br/>这3个模块都可以直接通过<a href=“http://npmjs.org/”>npm</a>安装获得: <br/><pre escaped=“true”><pre><code>$ npm install express ejs mysql <br/></pre></code></pre> <br/><h2>开发过程记录</h2> <br/><h3><a href=“https://github.com/fengmk2/todo/blob/master/config.js”>config.js</a></h3> <br/>可配置的信息: <br/>* 网站名称 <br/>* 监听端口号, 默认8080 <br/>* 数据库配置信息 <br/><h3>如何访问数据库</h3> <br/>在<a href=“https://github.com/fengmk2/todo/blob/master/config.js”>config.js</a>文件里面, 会使用一下方式保持着数据库的链接对象 <br/><pre escaped=“true”><pre><code>var db = exports.db = new require(‘mysql’).Client(db_options); <br/>db.connect(function(err) { <br/> if(err) { <br/> console.error('connect db ’ + db.host + ’ error: ’ + err); <br/> process.exit(); <br/> } <br/>}); <br/></pre></code></pre> <br/>这样我们就可以在别的地方直接使用db对象了 <br/><h3><a href=“https://github.com/fengmk2/todo/blob/master/server.js”>server.js</a></h3> <br/>express可以帮我们默认实现了静态文件处理, cookie处理, 请求参数处理等事情, 只需要配置一下, 就可以使用上这些功能了. <br/><pre escaped=“true”><pre><code>var app = express.createServer(); <br/>app.use(express.static(__dirname + ‘/public’, {maxAge: 3600000 * 24 * 30})); <br/>app.use(express.cookieParser()); <br/>app.use(express.bodyParser()); <br/></pre></code></pre> <br/>同样, 需要配置模版渲染引擎为ejs <br/><pre escaped=“true”><pre><code>app.set(“view engine”, “html”); <br/>app.set(“views”, _dirname + ‘/views’); <br/>app.register(“html”, ejs); <br/></pre></code></pre> <br/>看看views/index.html里面的一个最复杂的模版例子, <br/>ejs最让我喜欢的是不用再学一套语法, 直接是内嵌js, 还是很容易读懂的 <br/> <br/><img src=“http://ww1.sinaimg.cn/large/6cfc7910jw1dix6f9kailj.jpg” alt=“http://ww1.sinaimg.cn/large/6cfc7910jw1dix6f9kailj.jpg” /> <br/><h3>URL Routing与Controllers</h3> <br/>一个http请求过来, 由那个controller处理, express提供了简便的routing方式 <br/><pre escaped=“true”><pre><code>app.get(’/’, todo.index); <br/>app.post(’/todo/new’, todo.new); <br/>app.get(’/todo/:id’, todo.view); <br/>app.get(’/todo/:id/edit’, todo.edit); <br/>app.post(’/todo/:id/edit’, todo.save); <br/>app.get(’/todo/:id/delete’, todo.delete); <br/>app.get(’/todo/:id/finish’, todo.finish); <br/></pre></code></pre> <br/>如添加一条todo记录: HTTP GET /new, 将由<a href=“https://github.com/fengmk2/todo/blob/master/controllers/todo.js”>todo.new</a>方法处理, <br/>代码逻辑包括了title参数有效性验证, 数据保存到数据库, http redirect: <br/><pre escaped=“true”><pre><code>exports.new = function(req, res, next) { <br/> var title = req.body.title || ‘’; <br/> title = title.trim(); <br/> if(!title) { <br/> return res.render(‘error’, {message: ‘标题是必须的’}); <br/> } <br/> db.query(‘insert into todo set title=?, post_date=now()’, [title], function(err, result) { <br/> if(err) return next(err); <br/> res.redirect(’/’); <br/> }); <br/>}; <br/></pre></code></pre> <br/>更多的controller处理逻辑请查看<a href=“https://github.com/fengmk2/todo/blob/master/controllers/todo.js”>/controllers/todo.js</a>. <br/><h3>数据库初始化及启动Web进程</h3> <br/><pre escaped=“true”><pre><code>$ mysql xxx <br/>$ source ~/todo/todo.sql <br/>$ node server.js <br/></pre></code></pre> <br/><h3>有爱</h3> <br/>可以看到, 无论是python的web开发, 还是nodejs, 我们以前对web的概念还是无需改变的. <br/>都是我们熟悉的一些关键词: <br/>http, request, response, html, template engine, url routing, MVC, GET, POST, MYSQL, Database… <br/> <br/>不同的是, 这里只使用javascript就可以驱动着以上的一切. <br/> <br/>希望本文对你有用 ^^

22 回复

Learning! It is a really nice tutorial!

Learning,I’m just a Greener!

Hell yeah… you saved my day!

Required: {“node”:">= 0.4.1 < 0.5.0"} <br/> <br/>but my node version is v0.5.2-pre.

lingzuer@ubuntu:~$ npm install express <br/>npm ERR! Unsupported <br/>npm ERR! Not compatible with your version of node/npm: express@2.4.3 <br/>npm ERR! Required: {“node”:">= 0.4.1 < 0.5.0"} <br/>npm ERR! Actual: {“npm”:“1.0.15”,“node”:“v0.5.2-pre”} <br/>npm ERR! <br/>npm ERR! System Linux 2.6.38-10-generic <br/>npm ERR! command “node” “/usr/local/bin/npm” “install” “express” <br/>npm ERR! cwd /home/lingzuer <br/>npm ERR! node -v v0.5.2-pre <br/>npm ERR! npm -v 1.0.15 <br/>npm ERR! <br/>npm ERR! Additional logging details can be found in: <br/>npm ERR! /home/lingzuer/npm-debug.log <br/>npm not ok

你的node版本不对,请使用低于0.5.0的版本吧,目前express还没支持新版本的,不过你可以直接从github拉express的源代码即可

神啊 以后不会是js世界了吧

求稍微详细些的代码部署教程。 <br/>我在ubuntu上已经安装了nodejs、npm 以及express ejs mysql这些包, <br/>并将config.js中的配置信息改为了我数据库对应的配置信息, <br/>并且也在mysql中创建了数据库,但是运行 node server.js报错: <br/>Error: deprecated: use mysql.createClient() instead <br/> at Object.Client (/home/pulee/node/node_modules/mysql/lib/client.js:12:11) <br/> at Object. (/home/pulee/node/todo/config.js:16:44) <br/> at Module._compile (module.js:402:26) <br/> at Object…js (module.js:408:10) <br/> at Module.load (module.js:334:31) <br/> at Function._load (module.js:293:12) <br/> at require (module.js:346:19) <br/> at Object. (/home/pulee/node/todo/server.js:4:14) <br/> at Module._compile (module.js:402:26) <br/> at Object…js (module.js:408:10) <br/> <br/>将错误中提到的函数替换后,错误变为: <br/>Error: deprecated: connect() is now done automatically. <br/> at Client.connect (/home/pulee/node/node_modules/mysql/lib/client.js:40:9) <br/> at Object. (/home/pulee/node/todo/config.js:17:4) <br/> at Module._compile (module.js:402:26) <br/> at Object…js (module.js:408:10) <br/> at Module.load (module.js:334:31) <br/> at Function._load (module.js:293:12) <br/> at require (module.js:346:19) <br/> at Object. (/home/pulee/node/todo/server.js:4:14) <br/> at Module._compile (module.js:402:26) <br/> at Object…js (module.js:408:10) <br/>求指点,万分感谢!

将config.js 从16行开始修改成一下代码 <br/> <br/>var mysql = new require(‘mysql’), db = null; <br/>if(mysql.createClient) { <br/> db = mysql.createClient(db_options); <br/>} else { <br/> db = new mysql.Client(db_options); <br/> db.connect(function(err) { <br/> if(err) { <br/> console.error('connect db ’ + db.host + ’ error: ’ + err); <br/> process.exit(); <br/> } <br/> }); <br/>} <br/>exports.db = db;

我这里报了一个错,req.body.title是undefined,不知道是什么原因?不知道作者见到过么?

请问一下 那个npm 是怎么安装的啊 <br/>curl http://npmjs.org/install.sh | sh 我使用的虚拟机是不能上网的 我想把包下下来安装 但是不知道该怎么办 谁能告诉我啊。

[…] 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的版本,大伙儿可以来比较一下。当然这个网站过于简单,我也正在寻找更合适的项目。 […]

帮助是有,但是有木有 express之类的 使用教程。

原文:node-mysql: 纯javascript实现的mysql驱动, 无法安装任何mysql包依赖. <br/>是不用安装任何mysql包依赖吧。。。

没有报错!但是无法访问页面是怎么回事?

启动成功但是无法显示页面,出现Cannot GET /dbmysql,请教下访问的时候是否是localhost:8000/config.js文件中exports.site_name值?

不错。。。。

TypeError: Object function app(req, res){ app.handle(req, res); } has no method ‘dynamicHelpers’

我遇到这样的错误,请问是怎么回事呢? "TypeError: Object function app(req, res){ app.handle(req, res); } has no method ‘dynamicHelpers’ "

不错。学些了。来这里真是能学到不少nodejs的新只是啊。app store.

回到顶部