Upload
sakshamjindal
View
55
Download
7
Embed Size (px)
DESCRIPTION
ebook
Citation preview
1. Introductioni. About
2. Node.jsCorei. Assertii. Buffer
i. Bits&Bytes
TableofContents
ThisBookisavailablefreeonlineat:http://nelsonic.gitbooks.io/node-js-by-example/inMOBI(Kindle),PDF(everything)andePUB(iBooks).
AcomputerwithinternetaccessTime:30h(e.g.2months30minsperdayor1weekintensive)
Node.jsletsyoueasilybuildnetworkedsoftware(websites,applications"apps"usingJavaScript).
Node.jsisnot"point-and-click"likeWordPress,SquareSpaceorSalesforce.com;youwillneedtowritesome"code".ButasIwilldemonstrate,that'saloteasierthanitsounds(ifyou'renewtowritingcode),givesyoumorepower/flexibilityandputsyouinfullcontrol.
Ifyouhaveneverwrittenanycodeofanysortbefore,Irecommendyoustartingwith:http://gitbookio.gitbooks.io/javascript/YouneedtohaveJavaScriptbasicstomakethemostofNode.js
Yes!Someofthebiggestorganisations/companiesintheworldareusingNode.jsinProductionsystems.
Alibaba,Ajax.org,Box.com,BritishSkyBroadcasting(Sky/NowTV),CNN,Cloudup,CondeNast,DirectTV,DowJones,eBay,Etsy,FeedHenry,GitHub,Google,Groupon,HBO,Help.com,HP,iTV,Joyent(duh!),Klout,LinkedIn,McDonalds,Medium,Mozilla,NetFlix,OpenTable,PayPal,Pearson,Q,Revolt,Square,Tesco,ThomasCook,Trello,Uber,Voxer,Walmart,Wikimedia(inprogressofmovingtoSOAwithnode!)Yahoo,Yammer,Yandex,Zendesk
LearnNode.jsbyExample
Requirements
WhatisNode.js?
FrequentlyAskedQuestions(FAQ)
Q:IamNewtoProgrammingShouldIStartwithNode.js?
Q:Node.jsisnot"Version1.0"yetcanweuseditinProduction?
AShortListofCompaniesusingNode.js
Wantmore?See:http://nodejs.org/industry/andhttps://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node
http://nodejs.org/download/
Thenode.js("core")hasmanyusefulmodules.
Bookmark:http://nodejs.org/api(youwillcomebacktoit)
Whichnode.jscorepackage(s)can/shouldIuse?
Everycoremodulehasa"StabilityIndex"ratingonthenode.jsAPI.
Generalrule:Ifyouarebeingpaidtowritecodethatrunsinnode.js,pickcoremodules/methodswithstabilityStable,APIFrozenandLocked.
Tryit!
Download&Install
Node.js(Core)API
Stability(Canweuseit?)
clusterisExperimental-don'tusedomainisUnstable-don'tusepathisStable-useeventsisFrozen-useassertisLocked-use
CoreModulestoLearn
pathos
CommunityModulestoLearn:
jscs-codestylecheckerq-promiseslibrarynd-viewdocumentationforamodule
Examples
Thisbookisforeveryonewhowantstolearnnode.jsbutdoesn'tknowwheretostart.
About
Thenode.js("core")hasmanyusefulmodules.
Bookmark:http://nodejs.org/api(youwillcomebacktoit)
WearegoingtocoverthemoduleslabeledStability:Stable,APIFrozenandLocked.OnlyusetheExperimentalorUnstablecoremoduleswhenyouwanttotrythelatest&greatestandatyourownrisk;avoidusingthemonaprojectforaclient(unlessyougetagreementinwritingthattheywanttosailclosetothewindforaspecificuserfeature).
Node.js(Core)API
Node.jsinstalledNopriorknowledge
Basic/Beginner
Assert-verb-stateafactorbeliefconfidentlyandforcefully.(dictionarydefinition)
Whenwritingcodewewriteteststoautomaticallycheckourcodeisworkingasweexpectitto.
Assertisthemostrudimentarywayofwritingtests.Itprovidesnofeedbackwhenrunningyourtestsunlessonefails.
Theassertmodulehas11methodsbutyouwillonly(regularly)useafewofthem:assert.equal,assert.deepEqualandassert.throws.Eachareexplainedwithexamplesbelow.
Thefirstmethod(alphabetically),buttheleastusefulforpracticalpurposes(unlessyouexpectamethod/testtoalwaysfail).
Throwsanexceptionthatdisplaysthevaluesforactualandexpectedseparatedbytheprovidedoperator.
Example:
assert.fail(21,42,'TestFailed','###')
Output:
thrownewassert.AssertionError({^AssertionError:FaildatObject.(assert.js:2:8)atModule._compile(module.js:456:26)atObject.Module._extensions..js(module.js:474:10)atModule.load(module.js:356:32)atFunction.Module._load(module.js:312:12)atFunction.Module.runMain(module.js:497:10)atstartup(node.js:119:16)atnode.js:906:3
Usefulness:virtuallynone.Ihaven'tfoundapracticaluseforthis.http://nodejs.org/api/assert.html#assert_assert_fail_actual_expected_message_operator
Testsifvalueis"truthy",itisequivalentto:
Assertletsyoutestyourcode
Prerequisites
SkillLevel
What?
assert.fail(actual,expected,message,operator)
assert(value,message),assert.ok(value,[message])
assert.equal(true,value,message);
Thesimplestassertion.
Example:
varassert=require('assert');
functionadd(a,b){returna+b;}
varexpected=add(1,2);assert(expected===3,'oneplustwoisthree');
Thiswillnothaveanyoutput.Ifyouwanttoseeoutput,youneedtomakethetestfail:
varassert=require('assert');
functionadd(a,b){returna+b;}
varexpected=add(1,2);assert(expected===4,'oneplustwoisthree');
Output:
assert.js:92thrownewassert.AssertionError({^AssertionError:oneplustwoisNOTfouratObject.(/Users/n/code/node-js-by-example/core/assert/assert.js:8:1)atModule._compile(module.js:456:26)
assert.ok(value,[message])isessentiallythesameasassert(value,message);
varassert=require('assert');
functionadd(a,b){returna+b;}
varexpected=add(1,2);assert.ok(expected===3,'oneplustwoisthree');
Again,nooutputbecausethetestpasses.Toseesomefeedback,makethetestfail.
Usefulness:universal.assertcanbeusedtotestanycode.
Testsshallow,coerciveequalitywiththe(double)equalcomparisonoperator(==).
Ifyouwanttomakeyourtestcleareruseassert.equalotherwisethereisnobenefittotheadditionalverbosity.
Example:
assert.equal(actual,expected,[message])
Whywouldyouuseassert.equal()insteadofassert()?
varassert=require('assert');
functionadd(a,b){returna+b;}
varexpected=add(1,2);
//thesethreeassertionsareequivalent:assert(expected==3,'oneplustwoisthree');assert.ok(expected==3,'oneplustwoisthree');assert.equal(expected,3,'oneplustwoisthree');
Testsshallow,coercivenon-equalitywiththenotequalcomparisonoperator(!=).
Example:
varassert=require('assert');
functionadd(a,b){returna+b;}
varexpected=add(1,2);
//thesethreeassertionsareequivalent:assert(expected!=4,'oneplustwoisthree');assert.ok(expected!=4,'oneplustwoisthree');assert.notEqual(expected,4,'oneplustwoisthree(NOTFour!)');
Again,verbosity/clarityinyourtests.
Testsfordeepequality.
assert.deepEqualisthesecondoftheusefulmethods.Weuseitforcomparingtwoobjects(orarraysforequality).
Example:
varassert=require('assert');
varlist1=[1,2,3,4,5];varlist2=[1,2,3,4,5];
assert.deepEqual(list1,list2,'deepEqualcheckstheelementsinthearraysareidentical');
varperson1={"name":"john","age":"21"};varperson2={"name":"john","age":"21"};
//deepEqualcheckstheelementsintheobjectsareidenticalassert.deepEqual(person1,person2,'thesetwoobjectsarethesame');
Testsforanydeepinequality.Usefulwhenconfirmingtwoobjectsorarraysarenotequal.
Example:
assert.notEqual(actual,expected,[message])
Whywouldyouuseassert.notEqual(1,2)insteadofassert(1!=2)?
assert.deepEqual(actual,expected,[message])
assert.notDeepEqual(actual,expected,[message])
varassert=require('assert');
varlist1=[1,2,,3,4,5];varlist2=[1,2,3,4,5];
assert.deepEqual(list1,list2,'deepEqualcheckstheelementsinthearraysareidentical');
varperson1={"name":"john","age":"21"};varperson2={"name":"jane","age":"19"};
//deepEqualcheckstheelementsintheobjectsareidenticalassert.notDeepEqual(person1,person2,'thesetwoobjectsareNOTthesame');
Testsstrictequality,asdeterminedbythestrictequalityoperator(===)
Similartoassert.equalbut"strict"(typecoersion).
Example:
varassert=require('assert');
assert.strictEqual(1,'1','notthesame');//thiswillfail
Testsstrictnon-equality,asdeterminedbythestrictnotequaloperator(!==)
TheoppositeofthestrictEqual.
Example:
varassert=require('assert');
assert.notStrictEqual(1,true,'notthesame(strictly)');
Expectsblocktothrowanerror.errorcanbeconstructor,RegExporvalidationfunction.
Theassert.throwsletsyoucheckforspecificerrorsinyourfunctions.
Validateinstanceofusingconstructor:
Example:
assert.throws(function(){thrownewError("Wrongvalue");},Error);
Expectsblocknottothrowanerror,seeassert.throwsfordetails.
Example:
assert.strictEqual(actual,expected,[message])
assert.notStrictEqual(actual,expected,[message])
assert.throws(block,[error],[message])
assert.doesNotThrow(block,[message])
assert.doesNotThrow(function(){console.log("Nothingtoseehere");},Error);
Notparticularlyusefulmethodbecauseitstoovague.Itsgoodtoknowyourmethoddidnotthrowanerrorundernormalcircumstances.
Testsifvalueisnotafalsevalue,throwsifitisatruevalue.Usefulwhentestingthefirstargument,errorincallbacks.
Example:
//defineasimplefunctionwithcallback(err,value)functionsayHello(name,callback){varerror=false;varstr="Hello"+name;callback(error,str);}
//usethefunctionsayHello('World',function(err,value){assert.ifError(err);assert.equal(value,"HelloWorld");})
Aswithallcode,youcan'texpecttolearnwithouttrying.Opentheassert.jsfileinyoureditorandtryafewexamples.Rememberyouwon'tseeanyoutputunlessyourtestfails.Runitwiththecommand:
nodeassert.js
AssertAPI:http://nodejs.org/api/assert.htmlChrisJohansen'sintrotonodetesting:http://cjohansen.no/en/node_js/unit_testing_node_js_apps
Inthe"realworld"peoplerarelyusethenodeassertmodulebyits'self.Insteadatestrunnerisused.
ExamplesofNode.jstestrunnersinclude:
Mocha:https://github.com/visionmedia/mochaTape:https://github.com/substack/tapeLab:https://github.com/hapijs/lab
Eachofthesehastheirmeritsandwillbediscussedinalaterchapterontesting.
assert.ifError(value)
Tryit!
UsefulLinks
InPractice(The"RealWorld")
Buffersareaseriesofbytes.
Ifyouarecompletelynewtocomputerprogramming/science,here'saquickintrotoBits,BytesandOctets.
PureJavaScriptisUnicodefriendlybutnotnicetobinarydata.WhendealingwithTCPstreamsorthefilesystem,it'snecessarytohandleoctetstreams.Nodehasseveralwaysofmanipulating,creating,andconsumingoctetstreams.
BuffersareusedinternallybyNode.jsbutavailabletoeveryone.
Here'sasimpleexampleofcreatinganewBuffercontainingtheword"hello".Youwillnoticethatthebufferstoresthethehexadecimalvaluesforthecharacters.
Allocatesanewbufferofsizeoctets.
FeedingnewBuffer()anumericparametersimplyallocatesthatamountofmemorytothebufferforlateruse.
varbuf=newBuffer(10);//varstr=buf.toString();//3(incomprehensible-non-printablechars)
Practicaluse?None.(IfIfindoneIwillletyouknow.)
Allocatesanewbufferusinganarrayofoctets.
SimilartothenewBuffer(number)butallowsyoutopassinanarray;nodecreatesaplaceholderforeachelementinthearrayinyournewBuffer.
varbuf=newBuffer(['hello','world']);//varstr=buf.toString();//empty
Practicaluse?None.
strString-stringtoencode.encodingString-encodingtouse,Optional.
Allocatesanewbuffercontainingthegivenstr.encodingdefaultsto'utf8'.
varbuf=newBuffer('hello');//varstr=buf.toString();//hello
Buffers
Whatdoesthatmean?
Buffers
newBuffer(size)
newBuffer(array)
newBuffer(str,[encoding])
encodingStringTheencodingstringtotest
Returnstrueiftheencodingisavalidencodingargument,orfalseotherwise.
console.log("Buffer.isEncoding('utf8')>>"+Buffer.isEncoding('utf8'));//true
Again,can'tseeapracticalapplicationforthis.
ReturnsaJSON-representationoftheBufferinstance,whichisidenticaltotheoutputforJSONArrays.JSON.stringifyimplicitlycallsthisfunctionwhenstringifyingaBufferinstance.
varbuf=newBuffer('test');varjson=JSON.stringify(buf);
console.log(json);//'[116,101,115,116]'
varcopy=newBuffer(JSON.parse(json));
console.log(copy);//
http://nodejs.org/api/buffer.html#buffer_bufferAsciitohextobinaryconversiontable:http://www.ascii-code.com
ClassMethod:Buffer.isEncoding(encoding)
buf.toJSON()
Abitisthebasicunitofinformationincomputinganddigitalcommunicationsusuallyexpressedas0(Zero)or1(One).Thewordbitisshortforbinarydigit.Binarymeanstherearetwooptionse.g:true/false,0/1oron/off
StartingatZero,thefirst16numbersinBinaryare:
+---+---+----+----+-----+-----+-----+-----+------+------+------+------+------+------+------+------+|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|+---+---+----+----+-----+-----+-----+-----+------+------+------+------+------+------+------+------+|0|1|10|11|100|101|110|111|1000|1001|1010|1011|1100|1101|1110|1111|+---+---+----+----+-----+-----+-----+-----+------+------+------+------+------+------+------+------+
Didyouspotthepattern(s)?Ifnot,Isuggestyoureaduponcountingbinary:http://en.wikipedia.org/wiki/Binary_number
watch:https://www.youtube.com/watch?v=VBDoT8o4q00(howcomputerscount)
Abyteisaunitofdigitalinformationincomputingandtelecommunicationsthatmostcommonlyconsistsofeightbits.
010010000110010101101100011011000110111100100001Hello!
Tryit:http://text2binary.herokuapp.com/
Hexadecimal
Inmathematicsandcomputing,hexadecimal(alsobase16,orhex)isapositionalnumeralsystemwitharadix,orbase,of16.Itusessixteendistinctsymbols,mostoftenthesymbols09torepresentvalueszerotonine,andA,B,C,D,E,F(oralternativelyaf)torepresentvaluestentofifteen.
Bits
CountinginBinary(bits)
Bytes
Hello!inBinary(8-BitASCII)
Hexadecimal
IntroductionAbout
Node.js CoreAssertBufferBits & Bytes