2015-12-27 73 views
3

強類型的數據庫訪問當我們使用C#,我們可以在一個強類型的方式使用代碼優先方法進入我們的數據庫:用Node.js和受打字稿

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 
    public virtual List<Post> Posts { get; set; } 
} 
... 
public class Database : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
} 
var db = new Database() 
var blog = new Blog { Name = "My new blog", BlogId = 1 }; 
db.Blogs.Add(blog); 
db.SaveChanges(); // save object to database 

編譯器將encure,我們只訪問現有的屬性/方法,並且我們在代碼中的任何地方都使用正確的類型。

我如何做TypeScriptNode.JS一樣嗎?

我發現數據庫訪問Knex.JSbookshelf庫,但我無法找到如何使用它們的強類型TypeScript對象和類的任何樣品。

+1

我不使用Typescript,但有一個bookhelf和Knex的定義,您可以使用[tsd](https://www.npmjs.com/package/tsd)來管理/安裝這些定義。一旦安裝,一個體面的代碼編輯器將使用自動完成和文檔的定義(例如Visual Studio Code)。 – Shanoor

回答

0

你可以找到在github上DefinitelyTyped庫很多JS庫的類型定義。

您還可以使用tsd找到的工具here將這些定義文件添加到您的項目中。

總之,你需要在終端上運行這些命令4。

$ npm install tsd -g 
$ tsd init 
$ tsd install knex 
$ tsd install bookshelf 
1

正在詢問當前不可用的內容。
但是,實際上可以做到!你將不得不做一些努力!

正如你(可能)知道,打字稿只用在開發的時候,沒有進入運行,所以你要求你的數據庫結構類型驗證。

您將不得不創建一個在打字稿編譯器之前運行的構建步驟,此新構建步驟應該從數據庫結構中生成一個d.ts文件。它應該連接到數據庫,調查它並輸出描述其結構的接口。

請注意,這個結構會發生變化,根據你所使用的數據庫...

另一種解決方法是將手動創建d.ts文件自己,一旦你的數據庫結構的變化,你將不得不也在定義文件中反映(手動)。

+0

d.ts文件可以找到書架和knex他們只需要添加到項目就是了。 :) – toskv

+0

我看到你的答案,我不認爲他要求這種定義。他想要數據的實際結構... – gilamran

+0

嗯..你是對的,再次閱讀這個問題,聽起來更像是他想要在數據庫中存儲對象的類型定義。 – toskv

9

我搜索瞭如何使用Bookshelfjs以打字稿的例子網頁,有沒有文章或博客文章,可以幫助。我確實在github上發現了作爲DefinatelyTyped test file的一部分的測試,這是一個很好的起點。此外,很可能您希望將每個模型存儲在自己的文件中,這需要Bookshelfjs註冊表插件。 This article解釋了爲什麼,但在常規JavaScript的上下文中。

把它放在一起,假設您已正確安裝knexjs和bookshelfjs的打字。使用你的代碼爲靈感,進一步閱讀:

你可能已經被稱爲「Config.ts」有你的所有數據庫的詳細信息中有一個文件:

import * as Knex from 'knex'; 
import * as Bookshelf from 'bookshelf'; 

export class Config { 

    private static _knex:Knex = Knex({ 
     client: 'mysql', 
     connection: { 
      host  : '127.0.0.1', 
      user  : 'your_database_user', 
      password : 'your_database_password', 
      database : 'myapp_test', 
      charset : 'utf8' 
     } 
    }); 

    private static bookshelf:Bookshelf = Bookshelf(Config.knex); 

    public static bookshelf(): Bookshelf { 
     Config.bookshelf.plugin('registry'); 
     return Config._bookshelf; 
    } 
} 

你可能有一個提起所謂的「Blog.ts 「舉行博客模式(和另一個稱爲」郵政。TS」擔任此職的模型):

import {Config} from './Config'; 
import {Post} from './Post'; 

export class Blog extends Config.bookshelf.Model<Blog> 
{ 
    get tableName() { return 'books'; } 

    // strongly typed model properties linked to columns in table 
    public get BlogId(): number {return this.get('id');} 
    public set BlogId(value: number) {this.set({id: value})} 
    public get Name(): string {return this.get('name');} 
    public set Name(value: string) {this.set({name: value});} 

    posts(): Bookshelf.Collection<Post> { 
     return this.hasMany(Post); 
    } 
} 

module.exports = Server.bookshelf.model('Blog', Blog); 

而在你的‘App.ts’文件中,可以運行您的代碼如下所示:

import {Config} from './Config'; 
import {Blog} from './Blog'; 

var blog = new Blog(); 
blog.set({ Name : "My new blog", BlogId : 1 }); 
    .save(); 

我沒有測試代碼在這裏等我可能會有一些小的拼寫錯誤,但你明白了,請注意,我已經對類屬性使用了標題大小寫,但是我已經使用了數據庫字段的snake case。對於書架來說,開箱即用的命名約定必須遵守就像每個表被稱爲'id'的Id字段,關係的外鍵具有單一的表名稱版本(例如,對於用戶表,表中的Id將是'id',但登錄表中的外鍵將會是'user_id')。

無論如何,最好的方法是弄清楚如何使用Bookshelfjs和TypeScript思想(鑑於缺乏有關該主題的文檔),將結合DefinatelyTyped typedef書架來看看Bookshelfjs文檔。 .ts文件。

+0

這是一個很好的答案 - 幫助我在項目中得到這個工作,謝謝! – woolyninja