Bookshelf เป็น JavaScript ORM สำหรับ Node.js สร้างขึ้นบนตัวสร้างคิวรี Knex SQL มันมีทั้งอินเทอร์เฟซการโทรกลับตามสัญญาและแบบดั้งเดิมการสนับสนุนการทำธุรกรรมการโหลดความสัมพันธ์ที่กระตือรือร้น/ซ้อนกันความสัมพันธ์ความสัมพันธ์แบบ polymorphic และการสนับสนุนสำหรับความสัมพันธ์แบบหนึ่งต่อหนึ่งต่อหนึ่งและหลายต่อหลายคน
มันถูกออกแบบมาเพื่อทำงานกับ PostgreSQL, MySQL และ SQLITE3
เว็บไซต์และเอกสาร โครงการนี้โฮสต์บน GitHub และมีชุดทดสอบที่ครอบคลุม
ชั้นวางหนังสือมีจุดมุ่งหมายเพื่อให้ห้องสมุดง่าย ๆ สำหรับงานทั่วไปเมื่อสอบถามฐานข้อมูลใน JavaScript และสร้างความสัมพันธ์ระหว่างวัตถุเหล่านี้โดยใช้แนวคิดมากมายจากรูปแบบการทำแผนที่ข้อมูล
ด้วย codebase ที่กระชับและมีความรู้หนังสือชั้นวางหนังสือเป็นเรื่องง่ายที่จะอ่านเข้าใจและขยาย มันไม่ได้บังคับให้คุณใช้รูปแบบการตรวจสอบความถูกต้องใด ๆ และให้การโหลดความสัมพันธ์ที่มีประสิทธิภาพและมีประสิทธิภาพที่ยืดหยุ่นและซ้อนกันและการสนับสนุนการทำธุรกรรมชั้นหนึ่ง
มันเป็น Mapper ที่สัมพันธ์กับวัตถุแบบลีนทำให้คุณสามารถเลื่อนลงไปที่อินเทอร์เฟซ Knex ดิบเมื่อใดก็ตามที่คุณต้องการแบบสอบถามที่กำหนดเองซึ่งไม่เหมาะกับการประชุมสต็อก
คุณจะต้องติดตั้งสำเนา KNEX และ mysql
, pg
หรือ sqlite3
จาก NPM
$ npm install knex
$ npm install bookshelf
# Then add one of the following :
$ npm install pg
$ npm install mysql
$ npm install sqlite3
ห้องสมุดชั้นวางหนังสือจะเริ่มต้นโดยผ่านอินสแตนซ์ไคลเอนต์ KNEX ที่เริ่มต้น เอกสาร KNEX มีตัวอย่างจำนวนมากสำหรับฐานข้อมูลที่แตกต่างกัน
// Setting up the database connection
const knex = require ( 'knex' ) ( {
client : 'mysql' ,
connection : {
host : '127.0.0.1' ,
user : 'your_database_user' ,
password : 'your_database_password' ,
database : 'myapp_test' ,
charset : 'utf8'
}
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
// Defining models
const User = bookshelf . model ( 'User' , {
tableName : 'users'
} )
การเริ่มต้นนี้น่าจะเกิดขึ้นเพียงครั้งเดียวในแอปพลิเคชันของคุณ เนื่องจากมันสร้างพูลการเชื่อมต่อสำหรับฐานข้อมูลปัจจุบันคุณควรใช้อินสแตนซ์ชั้น bookshelf
ที่ส่งคืนตลอดห้องสมุดของคุณ คุณจะต้องจัดเก็บอินสแตนซ์นี้ที่สร้างขึ้นโดยการเริ่มต้นที่ใดที่หนึ่งในแอปพลิเคชันเพื่อให้คุณสามารถอ้างอิงได้ รูปแบบทั่วไปที่จะติดตามคือการเริ่มต้นไคลเอนต์ในโมดูลเพื่อให้คุณสามารถอ้างอิงได้ในภายหลัง:
// In a file named, e.g. bookshelf.js
const knex = require ( 'knex' ) ( dbConfig )
module . exports = require ( 'bookshelf' ) ( knex )
// elsewhere, to use the bookshelf client:
const bookshelf = require ( './bookshelf' )
const Post = bookshelf . model ( 'Post' , {
// ...
} )
นี่คือตัวอย่างที่จะเริ่มต้น:
const knex = require ( 'knex' ) ( {
client : 'mysql' ,
connection : process . env . MYSQL_DATABASE_CONNECTION
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
const User = bookshelf . model ( 'User' , {
tableName : 'users' ,
posts ( ) {
return this . hasMany ( Posts )
}
} )
const Post = bookshelf . model ( 'Post' , {
tableName : 'posts' ,
tags ( ) {
return this . belongsToMany ( Tag )
}
} )
const Tag = bookshelf . model ( 'Tag' , {
tableName : 'tags'
} )
new User ( { id : 1 } ) . fetch ( { withRelated : [ 'posts.tags' ] } ) . then ( ( user ) => {
console . log ( user . related ( 'posts' ) . toJSON ( ) )
} ) . catch ( ( error ) => {
console . error ( error )
} )
.set()
บนโมเดล Model
เพิ่มการประทับเวลาการตรวจสอบความถูกต้องของแอตทริบิวต์และวิธีการ CRUD ดั้งเดิมมีคำถามเกี่ยวกับห้องสมุดหรือไม่? มาร่วมกับเราในช่อง #bookshelf FreeNode IRC เพื่อรับการสนับสนุนใน knex.js และ bookshelf.js หรือโพสต์ปัญหาเกี่ยวกับสแต็กล้น
หากคุณต้องการมีส่วนร่วมในชั้นวางหนังสือโดยปกติคุณต้องการรายงานปัญหาหรือส่งคำตอบแบบดึง เพื่อจุดประสงค์นี้พื้นที่เก็บข้อมูลออนไลน์มีอยู่ใน GitHub
สำหรับความช่วยเหลือเพิ่มเติมในการตั้งค่าสภาพแวดล้อมการพัฒนาในท้องถิ่นของคุณหรือเรียนรู้วิธีที่คุณสามารถมีส่วนร่วมในชั้นวางหนังสือคุณควรอ่านเอกสารที่มีส่วนร่วมที่มีอยู่ใน GitHub
ใช่คุณสามารถโทร .asCallback(function(err, resp) {
บนวิธีการทำงานของฐานข้อมูลใด ๆ และใช้อินเตอร์เฟสการเรียกกลับสไตล์มาตรฐาน (err, result)
หากคุณต้องการ
ตรวจสอบให้แน่ใจว่าได้ตรวจสอบว่าประเภทนั้นถูกต้องสำหรับพารามิเตอร์เริ่มต้นที่ส่งผ่านไปยังโมเดลเริ่มต้นที่ถูกดึง ตัวอย่างเช่น new Model({id: '1'}).load([relations...])
จะไม่คืนค่าเช่นเดียวกับ new Model({id: 1}).load([relations...])
- ประกาศ ว่า ID เป็นสตริงในกรณีหนึ่งและหมายเลขอื่น ๆ นี่อาจเป็นข้อผิดพลาดทั่วไปหากการดึง ID จากพารามิเตอร์ URL
นี่เป็นปัญหาเฉพาะในกรณีที่คุณกระตือรือร้นที่จะโหลดข้อมูลด้วยการโหลดโดยไม่ต้องดึงรุ่นต้นฉบับก่อน new Model({id: '1'}).fetch({withRelated: [relations...]})
ควรทำงานได้ดี
ปัญหาที่นี่คือ KNEX ซึ่งเป็นเลเยอร์นามธรรมฐานข้อมูลที่ใช้โดยชั้นวางหนังสือใช้การรวมการเชื่อมต่อและทำให้การเชื่อมต่อฐานข้อมูลเปิดอยู่ หากคุณต้องการให้กระบวนการของคุณออกหลังจากสคริปต์ของคุณเสร็จสิ้นคุณจะต้องโทร .destroy(cb)
บนคุณสมบัติ knex
ของอินสแตนซ์ Bookshelf
ของคุณหรือในอินสแตนซ์ Knex
ที่ผ่านระหว่างการเริ่มต้น ข้อมูลเพิ่มเติมเกี่ยวกับการรวมการเชื่อมต่อสามารถพบได้ที่เอกสาร KNEX
หากคุณผ่าน debug: true
ในวัตถุตัวเลือกไปยัง knex
เริ่มต้นการโทรคุณสามารถดูการโทรแบบสอบถามทั้งหมดที่ทำ นอกจากนี้คุณยังสามารถผ่านตัวเลือกเดียวกันนั้นไปยังทุกวิธีที่เข้าถึงฐานข้อมูลเช่น model.fetch()
หรือ model.destroy()
ตัวอย่าง:
// Turning on debug mode for all queries
const knex = require ( 'knex' ) ( {
debug : true ,
client : 'mysql' ,
connection : process . env . MYSQL_DATABASE_CONNECTION
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
// Debugging a single query
new User ( { id : 1 } ) . fetch ( { debug : true , withRelated : [ 'posts.tags' ] } ) . then ( user => {
// ...
} )
บางครั้งคุณต้องดำน้ำต่อไปอีกเล็กน้อยและดูว่าทั้งหมดเกิดอะไรขึ้นเบื้องหลัง คุณสามารถใช้ Node-Inspector ซึ่งช่วยให้คุณสามารถดีบักรหัสด้วยคำสั่ง debugger
เช่นเดียวกับที่คุณต้องการในเบราว์เซอร์
Bookshelf ใช้สำเนาห้องสมุด Promise bluebird
ของตัวเอง คุณสามารถอ่านได้ที่นี่เพื่อดูเพิ่มเติมเกี่ยวกับสัญญาการดีบัก
การเพิ่มบล็อกต่อไปนี้ที่จุดเริ่มต้นของรหัสแอปพลิเคชันของคุณจะจับข้อผิดพลาดใด ๆ ที่ไม่ได้ติดอยู่ในตัวจัดการห่วงโซ่สัญญาปกติซึ่งมีประโยชน์มากในการดีบัก:
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
ดูเอกสารที่มีส่วนร่วมใน GitHub
ในขณะที่มันเป็นเป้าหมายเป็นหลัก node.js การพึ่งพาทั้งหมดนั้นเข้ากันได้กับเบราว์เซอร์และสามารถปรับให้เข้ากับสภาพแวดล้อม JavaScript อื่น ๆ ที่รองรับฐานข้อมูล SQLITE3 โดยการจัดหาอะแดปเตอร์ KNEX ที่กำหนดเอง ไม่มีอะแดปเตอร์ดังกล่าว
เราพบโครงการต่อไปนี้โดยใช้ชั้นวางหนังสือ แต่อาจมีอีกมาก: