前些天看scala,对函数式充满疑惑。心想,scala这么杂,若不干脆找个纯函数式语言来看看。
于是上infoq找了找,发现nodejs最近比较热,单线程高并发WEB架构。那就拿它来试水吧。
当前nodejs最新版本是v0.8.16。简单的看了一下,就是javascript在node环境下,可能干好多好多事情。由于单纯学习起来比较枯燥,于是把express3.3.4安装起来。
又学习下express。
express环境也比较简单,是一个基于nodejs的MVC框架,看过外媒那篇经典的nodejs入门之后,对于express就不会觉得突兀。因为express是在基于简单mvc思想构造下的封装而已。不需要太过于关注其内容。先学习下使用。
首先是跑express
在选择模板语言的时候考虑了一下,是使用默认jade,还是资料更多的ejs呢。ejs难度不大,套些html就行了。于是转用jade。jade与zen coding相差不大,不过也算是比较好的haml实现。喜欢haml的简洁。不过学习曲线挺陡,自己在tabs跟space上面吃了一些亏。要注意排版,其他的语法糖,记住就行了。
然后又需要操作数据库,跟nodejs搭配的多是mongodb,自己也下载了一个安装。然后就是学习下mongodb的基本操作。
然后是写了个网站登录、网站注册、网站注销的demo。
从demo里面也看得出纯手工操作mongodb是比较麻烦的。
于是便把mongoose找来。npm install mongoose 或在package.json里面的dependencies里加mongoose:"*"
于是上infoq找了找,发现nodejs最近比较热,单线程高并发WEB架构。那就拿它来试水吧。
当前nodejs最新版本是v0.8.16。简单的看了一下,就是javascript在node环境下,可能干好多好多事情。由于单纯学习起来比较枯燥,于是把express3.3.4安装起来。
又学习下express。
express环境也比较简单,是一个基于nodejs的MVC框架,看过外媒那篇经典的nodejs入门之后,对于express就不会觉得突兀。因为express是在基于简单mvc思想构造下的封装而已。不需要太过于关注其内容。先学习下使用。
首先是跑express
命令行node app 就行了
node app
在选择模板语言的时候考虑了一下,是使用默认jade,还是资料更多的ejs呢。ejs难度不大,套些html就行了。于是转用jade。jade与zen coding相差不大,不过也算是比较好的haml实现。喜欢haml的简洁。不过学习曲线挺陡,自己在tabs跟space上面吃了一些亏。要注意排版,其他的语法糖,记住就行了。
这里给一个简单的jade例子
doctype 5
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
body
div#navigation
ul
li
a(href='/') Index
li
a(href='/signup') SignUp
li
a(href='/signin') SignIn
if locals.user
li
a(href='/prefile') #{locals.user.name}
li
a(href='/signout') SignOut
li
a(href='/role/create') Role Create
//-
if locals.error
#{locals.error}
if locals.success
#{locals.success}
if locals.phone
#{locals.phone}
if locals.iphone
#{locals.iphone}
if flash.error
li= flash.error
if flash.success
li= flash.success
block content
//
Created with JetBrains WebStorm.
User: linpeng
Date: 13-8-13
Time: PM 3:47
extends layout
block content
h1= title
p Welcome to #{title}
if !locals.user
form#signin_form(method='POST',action='/signin')
label(for="username")
input(type="text",id="username",name="user[username]")
label(for="password")
input(type="password",id="password",name="user[password]")
input(type="submit",value="提交")
然后又需要操作数据库,跟nodejs搭配的多是mongodb,自己也下载了一个安装。然后就是学习下mongodb的基本操作。
mongod -dbpath dbpath -port 27017
mongo
use dbname;
show dbs;
db.collection.find()
db.collection.find({name:'name'});
下面给出一个mongo例子:
C:\Users\linpeng>mongo
MongoDB shell version: 2.4.5
connecting to: test
Server has startup warnings:
Wed Aug 14 09:37:05.570 [initandlisten]
Wed Aug 14 09:37:05.570 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.
Wed Aug 14 09:37:05.571 [initandlisten] ** 32 bit builds are limited to less than 2GB of data (or less with --journal).
Wed Aug 14 09:37:05.572 [initandlisten] ** Note that journaling defaults to off for 32 bit and is currently off.
Wed Aug 14 09:37:05.573 [initandlisten] ** See http://dochub.mongodb.org/core/32bit
Wed Aug 14 09:37:05.574 [initandlisten]
> use makkt
switched to db makkt
> show collections;
roles
sessions
system.indexes
units
users
> db.users.find();
{ "name" : "admin", "password" : "vL4zZeasleosA0OiOVg03Q==", "_id" : ObjectId("520adf6a00ae8a2008000001"), "__v" : 0 }
{ "name" : "222", "password" : "vL4zZeasleosA0OiOVg03Q==", "_id" : ObjectId("520aeb7a8fa98f8c1d000001"), "__v" : 0 }
{ "name" : "demo", "password" : "vL4zZeasleosA0OiOVg03Q==", "_id" : ObjectId("520b372544f01e981d000002"), "__v" : 0 }
> db.users.find({name:'admin'});
{ "name" : "admin", "password" : "vL4zZeasleosA0OiOVg03Q==", "_id" : ObjectId("520adf6a00ae8a2008000001"), "__v" : 0 }
然后是写了个网站登录、网站注册、网站注销的demo。
从demo里面也看得出纯手工操作mongodb是比较麻烦的。
于是便把mongoose找来。npm install mongoose 或在package.json里面的dependencies里加mongoose:"*"
然后就是对照mongoose官网翻阅了一翻,先连接mongodb,然后写Schame,然后Model。最后exports出去。这样mongoose的工作就完了。没什么比较麻烦的东西,主要是Schame的定义以及Query查询。
这里给一个Model的例子
/**
* Created with JetBrains WebStorm.
* User: linpeng
* Date: 13-8-9
* Time: PM 2:11
*/
var mongoose = require('mongoose');
var config = require('./../config');
var nameProperty = { type: String, index: { unique: true }};
var userSchema = mongoose.Schema({
name:nameProperty, password:String
});
var User = mongoose.model('user',userSchema);
module.exports = User;
又发现网站需要flash操作。于是npm install flashify
npm WARN package.json application-name@0.0.1 No README.md file found!
npm http GET https://registry.npmjs.org/flashify
npm http 200 https://registry.npmjs.org/flashify
npm http GET https://registry.npmjs.org/flashify/-/flashify-0.1.2.tgz
npm http 200 https://registry.npmjs.org/flashify/-/flashify-0.1.2.tgz
flashify@0.1.2 node_modules\flashify
整体来说,nodejs、express、mongoose操作都不复杂,主要难点在于集成在一起,js调试比较麻烦,ide我推荐webstorm。然后就是nodejs本身的异步处理,有些异步方法是在不根据代码顺序执行的,有时候需要注意一下,要把依赖异步处理结果的执行步骤,放在异步处理方法体内。这些问题出现在连接数据库,读磁盘等比较费时费力的操作上面。
经过nodejs这一遭,对函数式有了初步的了解。与 java不同,函数式讲究的是返回结果,一个函数就是一个操作集,操作结束,给个结果。是动词,更少的名词,与指令式有本质区别。
学习资料:
mongoose http://mongoosejs.com/index.html
jade语法(英文)http://naltatis.github.io/jade-syntax-docs/