Skip to content

Node学习笔记-Data Sources and Flow Control

Posted on:2014-11-6 21:17

额在之前的笔记中,提到了使用middleware,设置路由,发送数据,处理请求,渲染模板等。但是这些都不足以完成一个Web应用程序,动态数据交互需要和数据库联系在一起。当用户向服务器发送一个请求,响应的服务器可能就需要向数据库发送请求,此时,之后当数据库将数据返回给服务器,服务端才能够将响应给用户。好的,在这里就涉及到了服务端的流控制(server-side flow control)

Connecting to Database

在Node中没有的提供默认的链接数据的方法,同时又有很多类型的数据库都支持在Node中使用。至于如何选择还是要看具体情况具体分析。书上用的例子是Redis,这是一个很轻量级的数据,具体的我也不太懂。这里是它的官网,由于没有官方的window版本,我决定先试试用SQLite。

之前有过一个sqlite的数据文件,里面是在豆瓣电影上抓取的一点点东西,正好可以用上。

Node的包实在是太多了,往往有时候陷入选择困难症……。我选用的是叫做sqlite3的modules,NPM上提供的详细资料在这里这里还有其API文档。

在server.js的目录下新建db文件夹,里面放着待会儿要用的db文件。在Node中使用sqlite时,也要先引用它对应的module。

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('./db/douban.rdb');

路由的设置和之前的一样,采用connect-route,从数据库读取到数据完成之后,调用回调函数,回调函数中的参数row包含每一行的数据,

<!--movie.html template-->
<h1>豆瓣电影</h1>
<dl>
    <dt>{{name}}</dt>
    <dd><img src="{{img}}" alt="{{name}}"></dd>
    <dd><a href="{{href}}">{{name}}</a></dd>
    <dd><span>{{type}}</span> &nbsp;&nbsp;<span></span></dd>
</dl>
// server.js
// 忽略外部函数,只显示核心代码
router.get('/movie', function(req, res, next){
    var search = db.each("select * from MOVIE", function(err, row){
        console.log(row);
        var movie={
            name:row.name,
            href:row.href,
            img:row.post_url,
            type:row.type
        };
        var readable = mu.compileAndRender('movie.html', movie);
        readable.pipe(res);
    });
});

这应该算的上是Node中操作数据库最简单的例子,执行select语句读取数据,然后将数据渲染到模板中,呈现给用户。觉得还是有必要把sqlite3的API稍微翻译下做个笔记,不然每次都去查有点子麻烦。

Storing Data in Files

上面讲的是从数据库中取数据,现在来说说如何存储数据。其实我觉得这些问题,只要搞明白了一个,其他的也就不怎么困难了。取数据的时候我们是先访问数据库,然后查找,找到自己需要的数据之后返回就行,大体上就是这么个过程,那么反过来存储数据就是 先准备好打算存储的数据,然后访问数据库,将要存储的数据存入数据库就行了。整个过程都依赖相应数据库modules的API,看懂了API结合着操作几次,差不多就熟练了。我觉得这也没什么好说的。

node-sqlite3 简单的操作

来自node sqlite3 wiki api

new sqlite3.Database(filename, [mode], [callback])

返回一个新的Database对象,并且自动打开这个数据库。没有其他间接的方法来打开数据库。

sqlite3.verbose()

设置执行模式。See the wiki page on debugging for more information.

Database#close([callback])

关闭数据库

Database#run(sql, [param, …], [callback])

执行SQL语句,然后调用回调函数。返回的是一个Database对象,可以链式调用。

      // Directly in the function arguments.
      db.run("UPDATE tbl SET name = ? WHERE id = ?", "bar", 2);

      // As an array.
      db.run("UPDATE tbl SET name = ? WHERE id = ?", [ "bar", 2 ]);

      // As an object with named parameters.
      db.run("UPDATE tbl SET name = $name WHERE id = $id", {
          $id: 2,
          $name: "bar"
      });

参数的键可以这么书写 :name, @name and $name. 建议使用 $name因为JS中允许使用$来声明变量。

更多详情请戳这里

Bye~下次再来……