So sánh MongoDB và MySQL

MongoDB là một NoSQL database, MongoDB dẫn đầu bảng xếp hạng trong thời gian dài (là NoSQL database tốt nhất). MongoDB có rất nhiều người hâm mộ, rất nhiều trong số họ đã kinh ngạc với các tính năng ưa thích và tốc độ của nó. Và, câu hỏi ở đây được đặt ra không phải là quá stupid ở tất cả trường hợp, giống MongoDB đã promoted với tốc độ kinh ngạc và nêu ra cách MangoDB chạy nhanh và tốt hơn MySQL. Nhưng vẫn còn một điều, cuộc sống không hề đơn giản. ;D Hãy nhìn nhanh vào trong hoạt động nội bộ của các database engines này và trả lời câu hỏi.

MySQL xử lý các query như thế nào?
MySQL dựa trên khái niệm của một database khá cũ. Đó là lý do tại sao nó có một số vấn đề để nói. Khi bạn nghĩ về lịch sử của MySQL, nó có thể giải thích chi tiết lý do cách xây dựng như những gì bạn đã thấy. Qua đó có thể thấy rằng, MySQL cũng sử dụng các kỹ thuật hiện đại như sử dụng multiple threads để tăng hiệu suất, khi nhiều query cần được xử lý cùng một thời điểm, một số threads làm việc để xử lý các query song song với nhau. Nếu có một trường hợp high load (tải ở mức cao) với một lượng lớn query, MySQL xử lý cùng lúc một số query trong số chúng. Để tránh va chạm đối với các write query khác MySQL sử dụng một kỹ thuật gọi là locks để block các write query khác và bảo vệ các write query trên cùng một bản ghi(entry). Phụ thuộc vào storage engine bạn sử dụng, một cơ chế được gọi là row-locking có thể được sử dụng. Với row-locking, nếu một write query ở một row, cơ chế này sẽ block các query khác ghi dữ liệu vào cùng row đó cho đến khi quá trình ghi dữ liệu của query trước kết thúc. Cùng một thời điểm, các query khác vẫn có thể thay đổi, ghi dữ liệu ở các row khác trên cùng một table bằng một thread khác.

MongoDB xử lý các query như thế nào?
Khái niệm nội bộ của MongoDB hoàn toàn khác với MySQL. Để so sánh giữa chúng ở đây, tôi sẽ tập trung vào một điểm quan trọng, bỏ qua các điểm khác. Các query MongoDB không được xử lý song song cùng lúc. Tất cả các query tới MongoDB Server được đưa vào một hàng đợi, và server xử lý từng query một(tại thời điểm này, không có sự khác nhau nếu query được gửi tới cùng một collection [trong SQL là table], database hoặc không). MongoDB sử dụng một kỹ thuật gọi là instance-wide-locking. Điều này có nghĩa là, toàn bộ quá trình xử lý chỉ có thể chạy một query tại một thời điểm. Để loại bỏ một ít ‘nút cổ chai’, MongoDB đang chuyển sang database-wide-locks như đã đề cập trong release notes mới nhất.

Vậy điều này hàm ý gì? instance-wide-lock cho phép toàn bộ MongoDB Server để xử lý chỉ một write query ở cùng một thời điểm. database-wide-lock cho phép MongoDB Server xử lý chỉ một write query đối với mỗi database, nhưng có thể xử lý nhiều database cùng lúc. Điều này có thể khiến bạn cảm thấy thật khủng khiếp, nhưng có một điều bạn cần nhớ là các query trong MongoDB được xử lý nhanh hơn rất nhiều trong MySQL, và bạn sẽ thấy rằng nó không còn là vấn đề lớn. Tất nhiên, tất cả những điều nói ra ở đây chỉ có tác dụng nếu bạn thiết lập database một cách chính xác.

Làm thế nào so sánh MongoDB với MySQL?
Xét về hiệu xuất của một query đơn giản và duy nhất, MongoDB sẽ nhanh hơn rất nhiều MySQL. Trong kinh nghiệm của tôi, bạn có thể sẽ thấy được sự khác biệt trong các tình huống high load (tải ở mức cao) và một số trường hợp truy vấn phức tạp, hoặc đặc biệt. Trong MySQL, tất cả các quản trị dữ liệu đều hiểu tầm quan trọng của database indexes. So sánh với MangoDB có vẻ như hầu hết các quản trị viên không biết một cái gì tồn tại như indexes! Điều này bắt nguồn từ một thực tế, MongoDB là structureless database, tại sao tôi phải quan tâm indexes? Nhưng ở đây tôi muốn chỉ ra đây rằng việc sử dụng indexes thích hợp ít nhất cũng quan trọng như với các database engines khác.

ndexes trong MongoDB quan trọng như thế nào?
MongoDB sử dụng instance-wide-lock hoặc database-wide-lock đối với các write query. Nó có thể quan trọng hơn đối với việc thiết lập đúng đắn indexes trong MySQL. Để tôi cho bạn một ví dụ trong kinh nghiệm của tôi, và giả sử dụng chúng ta sử dụng instance-wide-locking.

Hình dung rằng bạn có một table với vài triệu bản ghi, mỗi bản ghi có một vài trường có dữ liệu dài và lớn trong cả MongoDB lẫn MySQL và không có định nghĩa indexes, nếu một truy vấn được thực hiện để update 100 bản ghi với điều kiện theo giá trị của một trường chỉ định. Điều gì sẽ xảy ra lúc này?

MySQL bắt đầu xử lý truy vấn trong một thread, và một tất nhiên là MySQL sẽ thực hiện ‘full table scan’ để tìm kiếm các bản ghi phù hợp với điều kiện trong vài triệu bản ghi. Và có thể truy vấn này sẽ mất chừng 20 phút để hoàn thành.

MongoDB sẽ xử lý cùng một truy vấn và chỉ mất chừng 5 phút. Nghe có vẻ rất tuyệt vời phải không? Trong thực tế, MongoDB Server đã scan toàn bộ collection (trong SQL là table) để tìm ra các bản ghi có liên quan. Như đã thảo luận lúc trước, trong 5 phút đó MangoDB sẽ block toàn bộ việc xử lý write query của cả server. Lúc này bạn còn thấy là 5 phút có phải là nhanh? Và MongoDB tốt hơn bởi vì nó nhanh hơn?

Thời gian thực thi một truy vấn đơn lẻ so với tác động tổng thể trên hệ thống là 2 việc khác nhau hoàn toàn. MySQL vẫn xử lý các write query khác gửi đến server, thậm chí trên cùng một database hoặc cùng một table. Trong khi Server đang bận rộn với ‘quey tốn thời gian’, tài nguyên được sử dụng và không được giải phóng cho các truy vấn khác, những truy vấn khác có thể chạy chậm hơn nhưng chúng vẫn được xử lý.

Trong 5 phút xử lý query trong MongoDB, instance-wide-lock được active sẽ dẫn đến tất cả các truy vấn khác phải xếp hàng đợi, không có ngoại lệ nào ở đây. Tất cả các truy vấn phải chờ cho việc xử lý xong, và các query trong hàng đợi được xử lý từng cái một. Điều này vẫn còn đúng khi kết nối cơ bản đã bị ngắt do timeout hoặc một vài lý do khác. Với thời gian thực hiện truy vấn dài, như ví dụ trên đối với một truy vấn, một đoạn mã PHP hay Python đã timeout và kết thúc. Đối với các ứng dụng web, trình duyệt có timeout ngắn và sẽ ngắt kết nối đến server. Như đã đề cập, truy vấn được xếp hàng đợi ngay cả khi kết nối đã closed, và các truy vấn vẫn tiếp tục được xử lý theo thứ tự.

Trên cả 2 hệ thống MongoDB và MySQL, nếu định nghĩa đúng indexes sẽ làm giảm thời gian truy vấn rất nhiều.

Kết luận
Ngay cả khi MongoDB thực hiện các truy vấn đơn giản và duy nhất nhanh hơn rất nhiều MySQL, nhưng không có nghĩa là nó sẽ nhanh ở mọi trường hợp, ngay cả một structure-less databases như thế này cũng cần có một vài cách tổ chức, định nghĩa các indexes là nhiệm vụ quan trọng, thiếu indexes có thể gây ra các tác động lớn ngay cả khi thời gian thực hiện truy vấn nhanh hơn nhiều MySQL.

MongoDB development road map cho thấy, vấn đề được mô tả là một vài thứ mà các nhà phát triển nhận thức được, chuyển từ instance-wide-locking sang database-wide-locking là một bước tiến lớn và đúng đắn. Hi vọng rằng các tính năng hữu ích sẽ sớm được ra mắt.

Tóm lại MongoDB

– Ưu điểm
o Tốc độ nhanh
o Lưu trữ và biểu diễn dữ liệu dưới dạng document.
o Khả năng mở rộng cao
o Tính đáp ứng cao
– Nhược điểm
o Không toàn vẹn dữ liệu
o Tốn tài nguyên hệ thống.

So sánh tải của MongoDB và MySQL: http://www.moredevs.ro/mysql-vs-mongodb-performance-benchmark/

mongoDB – Giới thiệu về mongoDB

1. MongoDB và NoSQL là gì?

NoSQL ra đời năm 1998 bởi Carlo Strozzi khi ông lập mới một hệ cơ sở dữ liệu quan hệ mã nguồn mở nhanh và nhẹ không liên quan đến SQL Vào năm 2009, Eric Evans, nhân viên của Rackspace giới thiệu lại thuật ngữ NoSQL khi Johan Oskarsson của Last.fm muốn tổ chức một hội thảo về cơ sở dữ liệu nguồn mở phân tán. Thuật ngữ NoSQL đánh dấu bước phát triển của thế hệ CSDL mới: phân tán (distributed) + không ràng buộc (non-relational).

NoSQL nghĩa là Non SQL hay cũng có thể gọi là Not only SQL. Hiểu một cách đơn giản nhất thì NoSQL là một hệ cơ sở dữ liệu không sử dụng mô hình quan hệ như các hệ quản trị cơ sở phổ biến khác hiện nay như là MySQL hay SQL server.

Khi các hệ thống lớn ra đời, sự mở rộng về mặt quy mô cũng như tốc độ truy suất trở nên cần thiết hơn bao giờ hết. Cơ sở dữ liệu quan hệ khó có khả năng giải quyết triệt để những vấn đề này. Chính vì thế NoSQL ra đời nhằm khắc phục những vấn đề trên.

Có khá nhiều rất nhiều hệ thống sử dụng NoSQL như facebook thì có cassandra, google thì có bigtable. Tuy nhiên ở đây tôi xin giới thiệu về MongoDB. Bởi lẻ MongoDB miễn phí, dễ sử dụng, dễ cài đặt và hỗ trợ rất nhiều driver cho các ngôn ngữ lập trình phổ biến hiện nay.

2. Đặc điểm MongoDB

  • NoSQL lưu trữ dữ liệu của mình theo dạng cặp giá trị “key – value”. Sử dụng số lượng lớn các node để lưu trữ thông tin – Mô hình phân tán dưới sự kiểm soát phần mềm
  • Chấp nhận dữ liệu bị trùng lặp do một số node sẽ lưu cùng thông tin giống nhau
  • Một truy vấn sẽ được gửi tới nhiều máy cùng lúc, do đó khi một máy nào đó không phục vụ được sẽ không ảnh hưởng lắm đến chất lượng trả về kết quả
  • Phi quan hệ – không có ràng buộc nào cho việc nhất quán dữ liệu
  • Tính nhất quán không theo thời gian thực: Sau mỗi thay đổi CSDL, không cần tác động ngay đến tất cả các CSDL liên quan mà được lan truyền theo thời gian.

Thay cho việc lưu trữ dữ liệu vào các bảng có quan hệ với nhau như truyền thống, MongoDB lưu các dữ liệu cấu trúc dưới dạng giống với JSON(JavaScript Object Notation) và gọi tên là BSON. Dự án được bắt đầu triển khai vào tháng 10 năm 2007 bởi 10gen trong khi công ty này đang xây dựng một nền tảng như là dịch vụ (Platform as a Service) giống như Google App Engine. Phải đến năm 2009, dự án này được tách độc lập. Hệ thống có thể chạy trên Windows, Linux, OS X và Solaris. Nó được một số tổ chức sử dụng trong thực tế như:

  • Caigslist : Công ty làm việc trong lịch vực môi giới quảng cáo trên các website khác (giống adMicro của Việt Nam). MongoDB giúp cho công ty này quản lý hàng tỉ các bản ghi quảng cáo thuận tiện và nhanh chóng.
  • Foursquare là một mạng xã hội gắn các thông tin địa lý. Công ty này cần lưu dữ liệu của rất rất nhiều vị trí của các địa điểm như quán cafe, nhà hàng, điểm giải trí, lịch sử, … và ghi lại những nơi mà người sử dụng đã đi qua.
  • CERN : Trung tâm nghiên cứu năng lượng nguyên tử của Châu Âu, sử dụng MongoDB để lưu trữ lại các kết quả, dữ liệu thí nghiệm của mình. Đây là một lượng dữ liệu khổng lồ sẽ dùng để sử dụng trong tương lai.
  • MTV Networks, Disney Interactive Media Group, bit.ly, The New York Times, The Guardian, SourceForge, Barclays, …

3. Điểm mạnh MongoDB

  • Dễ học, có một số nét khá giống với CSDL quan hệ – Quản lý bằng command line hoặc bằng GUI như RockMongo hoặc phpMyAdmin
  • Linh động, không cần phải định nghĩa cấu trúc dữ liệu trước khi tiến hành lưu trữ nó -> rất tốt khi ta cần làm việc với các dạng dữ liệu không có cấu trúc.
  • Khả năng mở rộng tốt (distributed horizontally), khả năng cân bằng tải cao, tích hợp các công nghệ quản lý dữ liệu vẫn tốt khi kích thước và thông lượng trao đổi dữ liệu tăng.
  • Miễn phí

4. Kiến trúc MongoDB

Một MongoDB Server sẽ chứa nhiều database. Mỗi database lại chứa một hoặc nhiều colection. Đây là một tập các documnents, về mặt logic thì chúng gần tương tự như các table trong CSDL quan hệ. Tuy nhiên, điểm hay ở đây là ta không cần phải định nghĩa trước cấu trúc của dữ liệu trước khi thao tác thêm, sửa dữ liệu… Một document là một đơn vị dữ liệu – một bản ghi (không lớn hơn 16MB). Mỗi chúng lại chứa một tập các trước hoặc các cặp key – value. Key là một chuỗi ký tự, dùng để truy xuất giá trị dạng : string, integer, double, … Dưới đây là một ví dụ về MongoDB document

{
_id : ObjectId("4db31fa0ba3aba54146d851a"),
username : "joegunchy",
email : "[email protected]",
age : 26,
is_admin : true,
created : "Sun Apr 24 2011 01:52:58 GMT+0700 (BDST)"
}

Cấu trúc có vẻ khá giống JSON, tuy nhiên, khi lưu trữ document này ra database, MongoDB sẽ serialize dữ liệu thành một dạng mã hóa nhị phân đặc biệt – BSON. Ưu điểm của BSON là hiệu quả hơn các dạng format trung gian như XML hay JSON cả hệ tiêu thụ bộ nhớ lẫn hiệu năng xử lý. BSON hỗ trợ toàn bộ dạng dữ liệu mà JSON hỗ trợ (string, integer, double, Boolean, array, object, null) và thêm một số dạng dữ liệu đặc biệt như regular expression, object ID, date, binary, code.

5. CƠ CHẾ HOẠT ĐỘNG MONGODB

SHARDING

Sharding là cơ chế tự động của MongoDB dùng để chia tách một dữ liệu kích thước lớn cho rất nhiều server (thường gọi là cluster). Sharding được thiết kế để phục vụ 3 mục điêu cơ bản sau

Làm cho cluster “trong suốt” với người dùng: Để hoàn thành nhiệm vụ này, MongoDB sử dụng một quá trình routing đặc biết gọi là mongos. Mongos đứng trước cluster, đóng vai trò điều phối việc truy cập đến shard nào, trả dữ liệu từ shard nào ra. Nó chuyển tiếp các request tới các server khác có tài nguyên hoặc đến cluster đằng sau nó. Sau đó lắp ráp lại, và gửi các response lại về cho các client. Do đó, các client không cần biết rằng chúng đang giao tiếp với cluster nào thật sự mà chỉ biết rằng mình đang kết nối tới một server bình thường. Đây gọi là tính “trong suốt” với người sử dụng

Làm cho cluster luôn sẵn sàng để đọc hoặc ghi: Một cluster còn tồn tại phải đảm bảo được rằng nó luôn sẵn sàng. Mỗi phần con trong cluster sẽ có ít nhất một vài tiến trình phục vụ dự bị trên máy khác.

Làm cho cluster phát triển “tự nhiên”: Bất cứ khi nào người dùng cần thêm dung lượng, họ có thể thêm một cách dễ dàng Mỗi cluster khi được quản lý lại “thể hiện” như một node riêng lẻ và dễ dàng config.

BALANCING – CÂN BẰNG TẢI

Nếu có nhiều shard đang sẵn sàng và có thêm chứa thêm dữ liệu, MongoDB sẽ tiến hành chuyển dữ liệu từ các shard khác sang để cân bằng tải. Cách thức tiến hành là di chuyển các chunk từ shard này sang shard khác một cách tự động. Balancing cũng có thể bị tắt hoặc bật nếu admin muốn Balancing cũng không được đảm bảo ngay tức thì, chúng ta hãy xem ví dụ dưới đây

Tham khảo: http://bigsonata.com/mongodb/

 

nodejs – Viết ứng dụng chat đơn giản

Bước 1: cài đặt gói phụ thuộc

Tham khảo thêm tại https://vneconomics.com/nodejs-cai-dat-nodejs-nmp-va-package-tren-ubuntu-linux-mint/

Cài gói socket.io: apt-get install socket.io (Tại thư mục gốc của app)

Bước 2: Tạo dịch vụ server.js

var io = require(‘socket.io’).listen(8000);

// open the socket connection
io.sockets.on(‘connection’, function (socket) {

// listen for the chat even. and will recieve
// data from the sender.
socket.on(‘chat’, function (data) {

// default value of the name of the sender.
var sender = ‘unregistered’;

// get the name of the sender
socket.get(‘nickname’, function (err, name) {
console.log(‘Chat message by ‘, name);
console.log(‘error ‘, err);
sender = name;
});

// broadcast data recieved from the sender
// to others who are connected, but not
// from the original sender.
socket.broadcast.emit(‘chat’, {
msg : data,
msgr : sender
});
});

// listen for user registrations
// then set the socket nickname to
socket.on(‘register’, function (name) {

// make a nickname paramater for this socket
// and then set its value to the name recieved
// from the register even above. and then run
// the function that follows inside it.
socket.set(‘nickname’, name, function () {

// this kind of emit will send to all! 😀
io.sockets.emit(‘chat’, {
msg : “naay nag apil2! si ” + name + ‘!’,
msgr : “mr. server”
});
});
});

});

Bước 3: Tạo ứng dụng client – index.php

<html>
<head>
<script src=”http://localhost:8000/socket.io/socket.io.js”></script>
<script src=”http://code.jquery.com/jquery-1.6.2.min.js”></script>
<script>
var name = ”;
var socket = io.connect(‘http://localhost:8000’);

// at document read (runs only ones).
$(document).ready(function(){
// on click of the button (jquery thing)
// the things inside this clause happen only when
// the button is clicked.
$(“button”).click(function(){

// just some simple logging
$(“p#log”).html(‘sent message: ‘ + $(“input#msg”).val());

// send message on inputbox to server
socket.emit(‘chat’, $(“input#msg”).val() );

// the server will recieve the message,
// then maybe do some processing, then it will
// broadcast it again. however, it will not
// send it to the original sender. the sender
// will be the browser that sends the msg.
// other browsers listening to the server will
// recieve the emitted message. therefore we will
// need to manually print this msg for the sender.
$(“p#data_recieved”).append(“<br />\r\n” + name + ‘: ‘ + $(“input#msg”).val());

// then we empty the text on the input box.
$(“input#msg”).val(”);
});

// ask for the name of the user, ask again if no name.
while (name == ”) {
name = prompt(“What’s your name?”,””);
}

// send the name to the server, and the server’s
// register wait will recieve this.
socket.emit(‘register’, name );
});

// listen for chat event and recieve data
socket.on(‘chat’, function (data) {

// print data (jquery thing)
$(“p#data_recieved”).append(“<br />\r\n” + data.msgr + ‘: ‘ + data.msg);

// we log this event for fun 😀
$(“p#log”).html(‘got message: ‘ + data.msg);

});
</script>
</head>
<body>
<input type=”text” id=”msg”></input><button>Click me</button>
<p id=”log”></p>
<p id=”data_recieved”></p>
</body>
</html>

Bước 4: Chạy dịch vụ tại server.js

Command: nodejs server.js

Lưu ý check quyền thực thi cho file server.js

Nguồn: https://code.google.com/p/nodejs-win/wiki/SimpleChatSystem

Tested: http://www.codeproject.com/Articles/777640/Simple-chat-application-using-NodeJS-and-Socket-IO

nodejs – Cài đặt NodeJS NMP và Package trên Ubuntu Linux Mint

Bước 1: Cài đặt nodejs

Command: apt-get install nodejs

Bước 2: Cài đặt npm (Node Package Modules)

Command: apt-get install npm

Bước 3: Cài đặt package socket.io (Sử dụng làm web chat)

Command: npm install socket.io

(Lưu ý phải vào thư mục ứng dụng trước khi thực hiện lệnh cài đặt socket.io)

Laravel 08 – Sử dụng Laravel artisan trong Migration

1. Gán alias cho php artisan

Command: alias artisan=’php artisan’

2. Kiểm tra môi trường với Artisan

Command: artisan env

3. Khởi tạo artisan tinker

cmd: artisan tinker

4. Kiểm tra db

cmd: echo Config::get(‘database.connections.mysql.database’);

cmd: echo Config::get(‘database.connections.mysql.username’);

cmd: echo Config::get(‘database.connections.mysql.password’);

6 lệnh migration trong Laravel Artisan

Tạo một migration trong artisan

cmdn: artisan migrate:make CreateUsersTable

Thêm 1 field vào table sẵn có bằng artisan

cmd: artisan migrate:make addEmailToUsers –table=users

Show all db bằng artisan tinker

cmd: echo User::all();

 

[Laravel] 06 – Truyền dữ liệu từ Route sang View

Bước 1: Khai báo routes.php

Route::get('/about', function(){
    $title = 'Kevin Title';
    $body = 'PTIT_UEH';
    $data = array(
        'title' => $title,
        'body' => $body
    );
    return View::make('about',$data);
});

Diễn giải:

  • Chạy trang kevin/about
  • Truyền mảng data vào cho View ‘about’

Bước 2: Tạo file about.php trong View

<html>
<head>
    <title>
        Tựa đề bài viết <?php echo $title ?>
    </title>
</head>
<body>
<h1>day phan noi dung: <?php echo $body ?></h1>
</body>
</html>

Bước 3: Chạy thử chương trình localhost/about

 

Có một số cách truyền đặc biệt khác:

  • Truyền 1 biến: => with(‘bien’, dữ liệu);
  • Truyền vào thư mục con của View: return View::make(‘home.about’) => thư mục home nằm trong View, file about.php
Route::get('/about2', function(){
    $title = 'Kevin Title';
    $body = 'PTIT_UEH';

    $v = View::make('about.about');
    $v->title = $title;
    $v->body = $body;

    return $v;
});

Kevin

[email protected]

Cài đặt PHP Storm 8 trên Linux Mint / Ubuntu

B1: Tải PHP Storm tại https://www.jetbrains.com/phpstorm/download

B2: Giải nén tại thư mục /var/www/

B3: Chạy file /var/www/PhpStorm/bin/phpstorm.sh

B4: Crack bằng mã sau:

User Name: EMBRACE

License Key :
===== LICENSE BEGIN =====
43136-12042010
00002UsvSON704l”dILe1PVx3y4″B3
49AU6oSDJrsjE8nMOQh”8HTDJHIUUh
gd1BebYc5U”6OxDbVsALB4Eb10PW8″
===== LICENSE END =====

NodeJS thao tác với MongoDB

Bước 1: Cài đặt MongoDB Driver

Vào thư mục ứng dụng gõ lệnh: npm install mongodb

Bước 2: Khai báo kết nối MongoDB

Cấu trúc: mongodb://user:[email protected]:port/dbname

mongo.connect('mongodb://localhost/vneconomics',function(err,db){
  if(err) throw err;
  var col = db.collection('collection_name');
  col.insert({type:'data',type2:'data2'},function(){
    console.log('inserted');
  })
});

[email protected]

Sử dụng mysql driver trong NodeJS

Bước 1: Cài đặt

npm install db-mysql

Bước 2: Sử dụng

var mysql = require("db-mysql");
 new mysql.Database({
     "hostname": "localhost",
     "user": "user",
     "password": "password",
     "database": "test"
 }).connect(function(error) {
     if (error) {
         return console.log("CONNECTION error: " + error);
     }
     this.query()
         .select(["id", "user", "email"])
         .from("users")
         .where("role IN ?", [ ["administrator", "user"] ])
         .and("created > ?", [ new Date(2011, 1, 1) ])
         .execute(function(error, rows, columns){
             if (error) {
                 console.log('ERROR: ' + error);
                 return;
             }
             // Do something with rows & columns
         });
 });

Tham khảo thêm tại: http://nodejsdb.org/

Enable CORS trên Apache

Javascript ngày càng mạnh mẽ và phổ biến trong môi trường web mobility. CORS cho phép thực hiện các request cross domain. Mặc định hệ thống không cho phép thực hiện điều này. Để enable ta có thể thực hiện tại file cấu hình apache hoặc .htaccess

Ở trong bài hướng dẫn tôi sử dụng thao tác trên apache file.

Bước 1: Thêm dòng sau vào một trong các tab sau của apache2.conf <Directory> <Files> <VirtualHost> <Location>

  Header set Access-Control-Allow-Origin "*"

Bước 2: kiểm tra chạy thử

Khởi động lại apache. (Có thể bạn phải đặc tên domain trong apache conf)

Chạy lệnh:

apachectl -t

[email protected]