Node.js快速開發利器-Keystone.js

介紹

Keystone是以Express和MongoDB爲基礎搭建的開源的Node.js CMS和web應用程序平臺。css

Keystone在官網上聲稱:在Node.js中,用Keystone搭建數據驅動的網站、應用程序和API是最容易的。前端

之因此出此狂言,背後仍是有料的,Keystone自帶如下功能:node

  1. 內置Express.js和MongoDBgit

  2. 動態路由github

  3. 實用的數據庫域類型web

  4. 自動生成管理員界面mongodb

  5. 基於數據模型的表單處理數據庫

  6. 會話管理和認證功能npm

我以爲keystone最牛逼的地方就是根據你定義的模型自動幫你實現後臺管理界面,建立、管理、編輯和刪除等,這得省掉不少功夫了。這樣實現一個網站只要定義model和寫前端代碼就行了。json

這應該是前端猴子接外包的一個利器吧。

安裝準備

  1. 安裝node.js 0.10+

  2. 安裝mongodb v2.4+

  3. 安裝yeoman npm install -g yo

  4. 安裝keystone生成器 npm install -g generator-keystone

開始

  1. 建立項目目錄
    mkdir my-keystone

  2. 進入項目目錄
    cd my-keystone

  3. 生成代碼
    yo keystone

代碼生成器會問你幾個問題,好比項目名稱,是否內置博客、相冊和聯繫表單,是否添加User模型,添加管理員帳戶密碼

  1. 安裝依賴
    npm install

  2. 運行項目
    node keystone

打開http://localhost:3000 在瀏覽器查看
經過http://localhost:3000/keystone 打開後臺管理

Model

var keystone = require('keystone'),
    Types = keystone.Field.Types;
 
var Post = new keystone.List('Post', {
    autokey: { path: 'slug', from: 'title', unique: true },
    map: { name: 'title' },
    defaultSort: '-createdAt'
});
 
Post.add({
    title: { type: String, required: true },
    state: { type: Types.Select, options: 'draft, published, archived', default: 'draft' },
    author: { type: Types.Relationship, ref: 'User' },
    createdAt: { type: Date, default: Date.now },
    publishedAt: Date,
    image: { type: Types.CloudinaryImage },
    content: {
        brief: { type: Types.Html, wysiwyg: true, height: 150 },
        extended: { type: Types.Html, wysiwyg: true, height: 400 }
    }
});
 
Post.defaultColumns = 'title, state|20%, author, publishedAt|15%'
Post.register();

這是官網中給出的例子,一個文章的model,詳情

不得不提一下,keystone的圖片類型Types.CloudinaryImage,須要購買CloudinaryImage的服務,若是你不想用Cloudinary的服務的話,keystone還提供了Types.LocalFile,這樣咱們就能夠把image改爲:

image: { type: Types.LocalFile, dest: 'public/upload', 
        prefix: '/upload',
        format: function(item, file){
            return '<img src="'+file.href+'" style="max-width: 120px">';
        }
    }

這裏format是指針對後臺管理用的
若是你想使用CDN服務的話,能夠對圖片文件夾進行了CDN同步,而後修改prefix爲你的CDN提供商提供的前綴。

路由與視圖

路由配置文件:routes/index.js
中間件:routes/middleware.js

var keystone = require('keystone'),
    middleware = require('./middleware'),
    importRoutes = keystone.importer(__dirname);
 
// 經常使用中間件
keystone.pre('routes', middleware.initErrorHandlers);
keystone.pre('routes', middleware.initLocals);
keystone.pre('render', middleware.flashMessages);
 
// 處理404錯誤
keystone.set('404', function(req, res, next) {
    res.notfound();
});
 
// 處理其它錯誤
keystone.set('500', function(err, req, res, next) {
    var title, message;
    if (err instanceof Error) {
        message = err.message;
        err = err.stack;
    }
    res.err(err, title, message);
});
 
// 加載路由
var routes = {
    views: importRoutes('./views')
};
 
// 綁定路由
exports = module.exports = function(app) {
    
    app.get('/', routes.views.index);
    
    // 在路由以前,經過中間件作任何事情
    app.get('/protected', middleware.requireUser, middleware.other, routes.views.protected);
    
}

配置

keystone提供了不少可配置項,你能夠爲所欲爲地根據本身的需求配置,要了解Keystone支持的更多選項,請參見配置指南

配置須要修改的文件是keystone.js

項目結構

|--lib
|  定製的庫和代碼
|--models
|  程序的數據庫模型
|--public
|  公開的靜態文件 (css、js、images等)
|--routes
|  |--api
|  |  程序的api控制器
|  |--views
|  |  程序的視圖控制器
|  |--index.js
|  |  初始化程序的路由和視圖
|  |--middleware.js
|  |  爲路由定製的中間件
|--templates
|  |--includes
|  |  通用的 .jade 組件放這裏
|  |--layouts
|  |  基礎 .jade 佈局放這裏
|  |--mixins
|  |  通用的 .jade mixins放這裏
|  |--views
|  |  程序的視圖模板
|--updates
|  數據組裝和遷移腳本
|--package.json
|  給npm的項目配置
|--keystone.js
|  啓動程序的主腳本

缺點

keystone強大的自動生成的管理後臺,也是給我使用限制的地方,支持增刪改查、上傳文件等基礎功能,可是在一些業務定製下卻有失靈活性,或許是我研究不透,目前官方也沒有給出對後臺管理定製的文檔,後續我將研究下如何深度定製管理後臺,若是可行的話再來分享。

參考

中文文檔:http://keystonejs.com/zh/docs/
項目地址:https://github.com/keystonejs/keystone

相關文章
相關標籤/搜索