Node中的ORM库-Waterline

Waterline是Github中比较活跃的支持大部分主流数据库的ORM模块,其中包括关系型和非关系型。这篇文章我们就以sails-mongo(就是用waterline来操作mongodB)为例,结合Koa2写一个简单的Restful接口。其实也不算作严格的Restful,因为并没有做具体的路由匹配,也没有实现CRUD的所有功能,但是它们的接口在github上有介绍,通过以下的代码并不难实现所有的功能。

为了演示方便,不致于混淆,只创建了2个文件,分别是app.js和server.js,app.js里定义了koa产生的对象app以及中间件,server.js里定义了数据库模型、数据库的建立、服务器创建和启动。我们先看server.js:

var Waterline = require("waterline");
var mongoAdapter = require("sails-mongo");//mongo 适配器
var app = require("./app.js");
var http = require("http");

var userCollection = Waterline.Collection.extend({ //user model in database
    identity:"user",
    connection:"myMongo",
    attributes:{
        name:"string",
        age:{type:"integer",required:false}
    },
    autoCreatedAt:false,  //waterline会给collection自动加上createdAt和updatedAt字段,这里设置不加这两个字段
    autoUpdatedAt:false
});

var config ={
    adapters:{
        "mongo":mongoAdapter
    },
    connections:{
        myMongo:{
            adapter:"mongo",
            url:"mongodb://localhost:27017/test" //两种写法
            //host:"localhost"
            //database:"test"
        }
    }
};

var waterline = new Waterline();
waterline.loadCollection(userCollection);

waterline.initialize(config,function(err,models){ //首先初始化数据库
    var server = http.createServer(app.callback());
    app.models = models.collections;//用app来保存数据库里的models,是为了在app.js中使用
    app.connections = models.connections;
    server.listen(8080); //启动服务器
    server.on("listening",function(){
        console.log("listening...")
    });

});

在server.js里,将数据库里的models挂载到app上,而在app.js中能访问到app,所以就将models传到了app.js中。接下来看app.js:

var Koa = require("koa");
var app = new Koa();

app.use(async (ctx,next)=>{//在koa中,所有中间件的ctx是一样的
    ctx.request.models = app.models;//将app中的models存到ctx.request中,为了之后的中间件中获取
    await next();
});

app.use(async (ctx,next)=>{
    var User = ctx.request.models.user;//在ctx.request中获取User
    var doc = await User.create({name:"yingge",age:18});
    ctx.body = JSON.stringify(doc);
});

module.exports = app;

其实这个例子中完全可以直接从app中获取app.models.user,不用多此一举将app.models传给ctx.request.models,这样做的目的是为了考虑到路由比较多的情况,我们不会将所有的路由都写在app.js里,这时候,对于别的路由定义的文件,只能访问到ctx,即koa2的上下文。我们用ctx来存储公有的数据。第一个中间件结束后,访问第二个中间件,在第二个中间件里获取叫做User的model,返回创建的条目。

以上是仿照waterline官网上express的例子做出来的koa的demo。供学习和参考。

时间: 2024-11-02 23:48:44

Node中的ORM库-Waterline的相关文章

深入理解jQuery、Angular、node中的Promise

最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供基础功能.在用jQuery操作DOM的时候对Promise的使用欲不够强烈,最近学习node和Angular,需要用js写业务逻辑和数据操作代码的时候这种场景需求就出来了.一般来说事件适合在交互场景中运用,因为用户的行为本来就是分散的,而promise这样的流程控制适合在后台逻辑中处理业务. //j

在Django中使用ORM创建图书管理系统

一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等)会有点区别, 因此直接在你的项目中使用sql语句的话,不便于以后的修改,万一更换了数据库,那所有sql语句不就要重新写吗? 所以这个时候ORM就体现出优点了,你只需要写ORM的代码,它就会根据你连接的数据库自动帮你翻译成对应的sql语句, 也就是说无论你使用的是mysql还是oracle,ORM操

在iOS中创建静态库

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用. 重用代码的最简单方法是简单的 拷贝/粘贴 源文件.然而,这种方法很快就会成为维护时的噩梦.因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步. 这就是静态库要拯救你的.一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享. 在本教程中,你将用两种方法亲手创建你自己的通用静态库. 为了获得最佳效果,你应该熟悉Objective-

详解Xcode7中创建静态库

今天和大家一起来谈谈Xcode中的静态库,包括什么是静态库,如何在Xcode中创建静态库等内容,希望这篇Xcode教程 http://www.maiziedu.com/course/234/对打击有帮助. 一.静态库和动态库的区别: 静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝:动态库以 .dylib 和 .framework 形式存在,链接时不复制,程序运行时由系统动态加载到内存

node中的Readable - flowing/non-flowing mode

大家都知道在node中Readable Stream有两种模式: flowing mode和non-flowing mode. 对于flowing mode的Readable Stream, 我们是没法控制它何时去读数据读多少的,它会去尽快的去消耗data,并emit出来. 1 // in lib/_stream_readable.js 2 if (state.flowing && state.length === 0 &&!state.sync) { 3 stream.e

如何在android app中使用STL库

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared - STLport作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用. gnustl_st

node 进阶 | 通过node中如何捕获异常阐述express的特点

node如何捕获异常 node基于js的单线程,有了非阻塞异步回调的概念,但是在处理多个并发连接时,并发环境要求高,最重要的是单线程,单核CPU,一个进程crash则web服务都crash,但是为什么node还这么火?甚至有了Node工程师这个岗,肯定就是node有自己crash之前与之后的解决方法,比如捕获异常 问:nodejs如何捕获异常?答:回调函数中有err形参,console.log出来,这是我之前回答别人问题的答案,但是自从我这几天看了如何捕获异常,才知道捕获异常的精髓就是不要让服务

C++ 中的动态库(Windows)

库: 在C/C++中,使用库(Library)的技术,可以将编译好的符号提供给第三方使用. 库有两种: 1.动态库 Dynamic-Link Library (DLL)    (Linux下叫做 Shared Library) 2.静态库 Static Library 一.动态库的基本概念 创建DLL: 用VC创建一个类型为 "dll"的控制台项目,VC会自动创建DLL的项目框架 它自动生成一个DllMain函数,可以类比普通应用程序中的main函数 VC项目设置: 1.取消"

重回博客 谈一谈Node中的异步和单线程

重回博客,这个帐号之前注册后就只发了一篇博客.听朋友建议,决定一周两次更新. 第一篇谈论一下最近想的比较多的异步的问题. 传统多线程异步 传统的异步是多线程的,当要同时做两件事的时候,他们是执行在不同的线程里的.这就像是柜台卖东西,来了一个人就得找一个员工陪他,直到这个人走了这个员工才能接待下一个客人.店内的员工就像线程池里的空闲线程,空闲的时候可以去接待客人,可是同时只能接待一个人,要接待其他人就得找另外一个人. 电脑里的线程相当于一个员工团队,哪里需要去哪里.多线程的异步好处在于可以更多的占