0

ใช้ node.js กับ Apache HTTP server

ผมต้องการใช้ node.js กับ Apache HTTP server โดยที่ถ้ารับ request มาแล้วเป็นรูปภาพที่เป็น static file ก็ให้ Apache HTTP server เอามาแสดงผลเลย นอกจากนั้นก็ทำตัวเป็น reverse proxy ส่งต่อไปให้ node.js อีกที

สมมุติว่าเปิด node.js ไว้ที่ port 3000 แล้วกัน ที่ Apache HTTP server ผมต้องลง mod_rewrite และ mod_proxy_html มี set ค่าของ proxy นิดหน่อย ปกติใส่ในไฟล์ของ site ที่อยู่ใน /etc/apache2/site_enabled ถ้าใช้ Debian ตามนี้

  ProxyRequests off
  <proxy *>
     Order deny,allow
     Allow from all
  </proxy>

แล้วก็ใน .htaccess ผมใส่สิ่งนี้ไว้สำหรับ mod_rewrite อ่อแต่อย่าลืม AllowOveride ก่อนนะครับ

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/img
RewriteRule (.*)$ http://localhost:3000/$1 [P]

อันนี้ RewriteCond ก็จะบอกประมาณว่าอะไรที่อยู่ใน img ไม่ต้องทำ rewrite ส่วน url ที่เหลือก็ทำตัวเป็น proxy ( [P] ) ไปเรียกที่ node.js อีกที

ผมก็มั่ว ๆ นะครับพึ่งเคยใช้ก็อย่าเชื่อมาก ปกติใช้ nginx น่าจะง่ายกว่า แต่ในกรณีที่มันไม่มีก็นะ …

0

ลองใช้ jasmine-node เถื่อน ๆ :-P

ผมไปทำ spec ไว้ใน tests/spec/foo_spec.js ไม่ได้สื่ออะไรเลย

var subj = require(‘../../subj.js’);
describe(‘foo suite’, function() {
var subj_ = new subj.Subj();
it("do sth", function() {
expect(subj_.x).toBe(100);
});
});

แล้วก็ถามด้วยสิ่งที่จะโดน test

exports.Subj = Subj;
function Subj() {
this.x = 100;
}

ลง jasmine-node ด้วย

sudo npm install -g jasmine-node

เวลา test ก็สั่ง

jasmine-node tests

(tests นี่คือชื่อ folder นะ)

เป็นอันใช้ได้ แต่กว่าจะใช้ได้ก็ต้องมั่วอยู่สักพักอะนะ

แย่หน่อยผมไม่รู้อะไรเกี่ยวกับ BDD เลย แต่เห็น AngularJS มันใช้ตัวนี้ก็เลยใช้ตาม :-P

0

ใช้ bcrypt กับ mongodo ด้วยกันบน node.js … ใช้ Q ด้วย

  1. โปรแกรมนี้ไปเปิด database เอาข้อมูลของ user ชื่อ foo ออกมา
  2. เสร็จแล้วก็สร้าง password hash โดยที่ไม่ได้เอาข้อมูลของ user มาทำอะไรเลย :-P … แล้วจะรีบ query มาทำไม -_-!
  3. เสร็จแล้วก็ save ข้อมูลของ user ที่มี password hash ลงไปใน mongodb แล้วก็ปิดมันซะ
var Q = require('q');
var bcrypt = require('bcrypt-nodejs');

var mongo = require('mongodb'),
  Server = mongo.Server,
  Db = mongo.Db;

var server = new Server('localhost', 27017, {auto_reconnect: true});
var db_ = new Db('annotedw', server, {safe: true});
var coll_; 
var user_;

Q.ncall(db_.open, db_).then(
	function(db) {
		console.log("OPEN");
		return Q.ncall(db.collection, db, 'user');
	}
)
.then(
	function(coll) {
		console.log("COLL");
		coll_ = coll;
		return Q.ncall(coll.findOne, coll, {'username': 'foo'});
	}
)
.then(
	function(item) {
		user_ = item;
		console.log("CALL HASH");
		return Q.ncall(bcrypt.hash, bcrypt, "password", null, null);
	}
)
.then(
	function(hash) {
		console.log("HASH", hash);
		user_.password_hash = hash;
		return Q.ncall(coll_.update, coll_, {_id: user_._id}, user_);
	}
).then(
	function(update_result) {
		console.log("UPDATE RESULT", update_result);
		db_.close();
	}
)
.fail(
	function(error) {
		console.log("ERROR", error);
	}
);
0

Q + bcrypt-nodejs

ลองเรียก bcrypt โดยใช้ Q ดู ก็ไม่ยาก ใช้ท่ามาตรฐานได้เหมือนกัน

var Q = require('q');
var bcrypt = require('bcrypt-nodejs');

Q.ncall(bcrypt.hash, bcrypt, "password", null, null)
.then(
	function(hash) {
		console.log("HASH", hash);
		return Q.ncall(bcrypt.compare, bcrypt, "password", hash);
	}
)
.then(
	function(result) {
		console.log("Comparision result:", result);
	}
)
.fail(
	function(err) {
		console.log("ERROR", err);
	}
);
1

MongoDB Node.js และ Q

ผมจะเขียน web app บน Node.js ให้ไปเปิด database ที่ใช้ MongoDB แต่ว่าเขียนไปแล้วงง function ที่มันซ้อนกันอย่างมาก ก็เลยหาตัวช่วยดูอยู่หลายอย่าง สุดท้ายคิดว่าใช้ Q น่าจะง่ายที่สุดก็เลยลองเขียนดู แต่ว่าเป็น command line นะ

var Q = require('q');
var mongo = require('mongodb'),
  Server = mongo.Server,
  Db = mongo.Db;

var server = new Server('localhost', 27017, {auto_reconnect: true});
var db_ = new Db('annotedw', server, {safe: true});

Q.ncall(db_.open, db_).then(
	function(db) {
		return Q.ncall(db.collection, db, 'corpus');
	}
)
.then(
	function(coll) {
		return Q.ncall(coll.findOne, coll);
	}
)
.then(
	function(item) {
		console.log(item);
		db_.close();
	}
)
.fail(
	function(err) {
		console.log("Error: ", err);
	}
);

ผม save ไฟล์ข้างบนไว้ใน mongotry.js

เวลาเรียกก็ใช้ node mongotry.js แล้วก็ได้ผลแบบข้างล่าง

{ _id: 508ec1e02ca65709fc00000c,
  corpus_id: 12,
  create: Fri Jan 01 2010 00:00:00 GMT+0700 (ICT),
  name: 'KIN_1' }

มันก็พิมพ์ข้อมูลออกมา 1 item ตามต้องการ