±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcnblogs
,ÎÄÕÂÊÇÓÃʵÀý´úÂë˵Ã÷£¬Ö÷ÒªÊÇʹÓÃnode.js½øÐеÄweb¿ª·¢£¬Ï£Íû¶Ô´ó¼ÒÓаïÖú¡£ |
|
Ê×ÏȹØÓÚnode.jsµÄѧϰ£¬ÕâÀïÍÆ¼öÒ»±¾±È½ÏºÃµÄ½Ì³Ì£¬nodejs
web¿ª·¢Ö¸ÄÏ,¸ÃÊéͨË×Ò×¶®µØ½«node.jsÓïÑÔÌØÐÔ½²½âÍêÖ®ºó£¬ÓÖ´ÓÒ»¸öÏîÄ¿½Ç¶È´øÁì¶ÁÕßʹÓÃnode.jsѧϰweb¿ª·¢¡£ÏàÐÅÕâÊÇÒ»¸ö±È½ÏºÃµÄѧϰģʽºÍ¹ý³Ì¡£ÓÉÓÚÕâ±¾ÊéÊÇ2012Äê³öµÄ£¬ÊéÖеÄÒ»¸öweb½ÌѧÏîÄ¿ÊÇ¿ª·¢Ò»¸ö΢²©¡£´Ó2012µ½ÏÖÔÚ£¬node.js¼°ÆäÉú̬»·¾³·¢ÉúÁ˺ܴó¸Ä±ä£¬ËùÒÔ¹ØÓÚ¸ÃÊéµÄѧϰÈç¹ûÕÕ×ÅÊé±¾ÏÔÈ»ÊǹýÓڳ¾ɵġ£µ½Ä¿Ç°ÎªÖ¹£¬node.jsµÄweb¿ª·¢¿ò¼ÜÒѾÉý¼¶µ½ÁËExpress4.12.1,¶ÔÓÚMongoDBµÄ²Ù×÷¸ü¶àÊÇʹÓÃmongooseÕâ¸ö¶ÔÏóÄ£ÐÍ£¬¶ø²»ÊÇ֮ǰmongoDB
¹Ù·½ÌṩµÄÔÉúnode.jsµÄAPI£¬ËùÒÔ±¾ÎĽ«»ùÓÚnodejsV0.1033 + MongoDBV3.0.2+
Jade1.9.2 + mogooseV4.0.1À´Öع¹¸ÃÊéÖеÄ΢²©ÏîÄ¿£¬Õâ¸ö×éºÏÒ²ÊÇĿǰ×îеÄʹÓÃnode.js½øÐÐweb¿ª·¢µÄ³£ÓÃ×éºÏÖ®Ò»£¬Èç¹ûÐèÒªÈëÃÅʹÓÃnode.js½øÐÐweb¿ª·¢£¬ÕýÔÚѧϰnodejs
web¿ª·¢Ö¸ÄϵĺÍÏë¿ìËÙÁ˽ânode.js web¿ª·¢Ä£Ê½µÄÅóÓÑ£¬ÏàÐű¾ÎÄÊÇÓÐÒ»¶¨°ïÖúÒâÒåµÄ¡£
1.express¿ò¼Ü°²×°
1£©ÔÚnodeÃüÁîÐÐģʽÏÂÊäÈëÒÔÏÂÃüÁî
¸ÃÃüÁîÔÚÈ«¾Ö»·¾³Ï°²×°express¿ò¼Ü£¬ÔÚ°²×°ÍêÕâÒ»²½Ö®ºó£¬²¢²»ÄÜÖ±½ÓʹÓÃexpressÃüÁîÀ´Éú³ÉexpressÏîÄ¿£¬ÐèÒªÔÙ°²×°Ò»¸öexpressÏîÄ¿Éú³ÉÆ÷£¬ÔÚexpress2.XµÄ°æ±¾ÖÐÊDz»ÐèÒªµÄ£¬express4.X°æ±¾Ö®ºó½«ÏîÄ¿Éú³ÉÆ÷ºÍexpress±¾Éí·ÖÀëÁ˳öÀ´£¬Èç¹û²»°²×°express-generatorÕâ¸öÉú³ÉÆ÷¾ÍʹÓÃexpressÃüÁîÀ´Éú³ÉÏîÄ¿£¬»áÓöµ½±¨express²»ÊÇÄÚ²¿»òÍⲿÃüÁîÕâ¸ö´íÎó£¬ÕâÊÇÐèҪעÒâµÄµØ·½£¬nodejs
web¿ª·¢Ö¸ÄÏÔÊéÖÐÊÇûÓа²×°express-generatorÕâÒ»²½µÄ¡£
2£©°²×°express-generator
npm install
-g express-generator |
3)Éú³ÉÒ»¸öÏîÄ¿
cd ..
mkdir microblog
cd microblog
express micorblog |
ÕâÀïËæÒâÔÚÓ²ÅÌij¸öĿ¼Ï´´½¨Ò»¸ömicroblogµÄÎļþ¼Ð£¬½øÈë¸ÃÎļþ¼Ð£¬È»ºóʹÓÃexpress microblogÃüÁî´´½¨ÁËÒ»¸ömicroblogµÄexpressÏîÄ¿¡£
Éú³É½á¹¹ÈçÏ£º

ÆäÖÐapp.jsÊÇÏîÄ¿Èë¿ÚÎļþ£¬package.jsonÊÇnpm °ü¹ÜÀíÎļþ£¬binÎļþ¼ÐÀïÃæµÄwww.js·ÅһЩȫ¾ÖÅäÖÃÏîÒÔ¼°ÃüÁîÐÐÅäÖõȡ£public
Îļþ¼ÐÊÇÓÃÀ´´æ·ÅÏîÄ¿¾²Ì¬ÎļþĿ¼Èçjs,cssÒÔ¼°Í¼Æ¬£¬routesÎļþ¼ÐÊÇÓÃÀ´´æ·Å·ÓɼàÌýµÄ´úÂëÏà¹ØÎļþ¡£viewsÎļþ¼ÐÓÃÀ´´æ·ÅÄ£°åÎļþ£¬ÕâÀïÐèҪעÒâµÄÊÇexpress4.XʹÓÃjade×÷ΪÏîÄ¿µÄĬÈÏÄ£°åÒýÇæ£¬¶øÔÚÔÊéÖÐÊÇʹÓÃejs×÷Ϊģ°åÒýÇæµÄ£¬ËùÒÔÕâÀïĬÈÏÉú³ÉµÄÊÇjadeÎļþ¡£ÎÞ¿É·ñÈÏejsÊÇÒª¼òµ¥Ð©£¬µ«ÊÇÔÀí¶¼ÊÇÒ»ÑùµÄ£¬ÎÒÃÇʹÓÃjade×÷Ϊ¿ª·¢µÄÄ£°åÒýÇæ¡£
4£©Æô¶¯ÏîÄ¿²¢²é¿´
cd microblog
npm install
npm start |
½øÈëµ½microblogÎļþ¼Ð£¬°²×°ÏîÄ¿ËùÐèÏà¹ØÄ£¿é£¨¸ù¾Ýpacakge.jsonÎļþ£©£¬È»ºóÆô¶¯ÏîÄ¿£¬Õâʱºò´ò¿ªä¯ÀÀÆ÷²é¿´ÏîÄ¿ÊäÈëµØÖ·localhost:3000,½á¹ûÈçÏÂ˵Ã÷Ò»ÇÐÕý³££¬

µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃÇÒѾӵÓÐÁËÒ»¸öÔÚä¯ÀÀÆ÷ÖÐÔËÐеÄwebÏîÄ¿³ûÐΡ£ÏÂÃæ½øÐпª·¢£¬ÔÊéÖеÄ΢²©ÏîÄ¿µÄÖ÷Òª¹¦ÄÜÊÇÓû§Äܹ»×¢²áµÇ¼£¬È¨ÏÞ¿ØÖƲ¢ÈÃÓû§·¢²¼Î¢²©ÔÚÓû§¸öÈËÖ÷Ò³ºÍÏîÄ¿Ê×Ò³·Ö±ðÏÔʾ£¬ÕâЩ¹¦ÄÜÍêÕû°æ´úÂë»áÌṩ£¬ÓÉÓÚÆª·ùÔÒò£¬ÕâÀïÒÔÓû§×¢²áµÇ¼ģ¿éÀ´ËµÃ÷ÈçºÎ½øÐÐÒ»¸öÍêÕûÁ÷³ÌµÄweb¿ª·¢¡£
2.Ò³Ãæ²¼¾Ö
ÒÀÕÕweb¿ª·¢Á÷³Ì£¬ÎÒÃÇÊ×ÏÈÀ´¹¹½¨Ò»¸öÏîÄ¿Ö÷Ò³£¬ÏîÄ¿Ö÷Ò³ÊÇÓɲ¼¾ÖÎļþlayout.jadeºÍÄÚÈÝÎļþindex.jade×é³É£¬¹ØÓÚµÄjadeµÄѧϰ£¬ÕâÀïÌṩÁ½¸öµØÖ·£¬¶ÔÓÚÒÔǰʹÓùýÀàËÆÄ£°åÒýÇæÈçsmarty£¬razorµÈµÄ£¬¿ÉÒÔ¿´¿´Îĵµ¾ÍÄܹ»ÉÏÊÖ×öÁË£¬»ù±¾ÔÀí¶¼ÊÇ´óͬСÒì¡£jade¹ÙÍøÎĵµºÍĽ¿ÎÍøjade½Ì³Ì£¬¿´¿´ÕâÁ½¸ö½Ì³Ì¾Í»ù±¾¿ÉÒÔÕÆÎÕÁË£¬¹ØÓÚjadeµÄѧϰ£¬ÎÒÈÏΪÖ÷ÒªÊÇÏÖѧÏÖÓ㬶Ô×ÅÎĵµ±àÐ´Ò³Ãæ¼´¿É£¬µ±È»Èç¹ûÓкܶàʱ¼äÒ²¿ÉÉîÈëѧϰ¡£
´ò¿ªviewsÎļþ£¬½«layout.jadeÎļþ´úÂë¸ÄдÈçÏ£º
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
body
nav.header
ul.list
li.logo
a(href='/') Microblog
li
a(href='/') Ê×Ò³
li
a(href='/login') 怬
li
a(href='/reg') ×¢²á
div.container
block content
hr
footer.footer
p
a(href='http://myzhibie.coding.io') myzhibie
| @2015 |
ÐèҪעÒ⸸¼¶ÔªËغÍ×ÓÔªËØµÄ»»ÐÐÖ®¼äËõ½ø£¬jadeÊÇÀûÓÃËõ½øÀ´Çø±ð´úÂë²ã¼¶µÄ¡£
Ê×Ò³ÄÚÈÝÎļþindex.jade
extends layout
block content
main.main
section.intro
if message
h3.indexmes #{message}
//Èç¹ûÓû§µÇ¼»òÕß×¢²á³É¹¦²¢ÇÒûÓÐÔڵǼ״̬ϵã»÷×¢²á»òÕߵǼ
if success&&user
h1.welcome #{success}£¬»¶Ó #{user} À´µ½ Microblog
else if !success&&user
h1.welcome »¶Ó #{user} À´µ½ Microblog
else
h1.welcome »¶ÓÀ´µ½ Microblog
h3.tech MicroblogÊÇÒ»¸ö»ùÓÚNode.js,ʹÓÃexpress4.12.1,jade1.9.2ÒÔ¼°MongoDB´î½¨ÆðÀ´µÄ΢²©ÏµÍ³,ÊǶÔNode.js¿ª·¢Ö¸ÄÏÒ»ÊéÖнÌѧÏîÄ¿µÄÖØ¹¹¡£
p.btnlist
if user
a.login(href='/logout') Í˳ö
a.userlink(href='/users/#{user}') ·¢±íÎÄÕÂ
else
a.login(href='/login') 怬
a.register(href='/reg') Á¢¼´×¢²á
section.show
each val in posts
article.col
h3.author #{val.user}˵
p
| #{val.post} |
Ê×Ò³ÄÚÈÝÊǼ̳ÐÁËÄ£°åÎļþlayout.jade.ÔÊéÖÐʹÓõÄbootstrapÀ´¹¹½¨Ò³ÃæµÄcss²¼¾ÖºÍÑùʽ£¬ÕâÀïÎÒ×Ô¼ºÊÖдÁËÒ»¸ö·Âbootstrap·ç¸ñµÄ²¼¾ÖÑùʽ£¬Ã»ÓÐÓ¦ÓÃbootstrap,style.cssÎļþÈçÏ£º
body {
padding: 50px;
font: 14px "Lucida Grande", Helvetica,
Arial, sans-serif;
}
html,body,ul,p,hr,h3{
margin:0;
padding: 0;
}
a {
color: #00B7FF;
}
.header{
background:#337aB7;
width: 100%;
height: 60px;
color: #fff;
font-size: 22px;
overflow: hidden;
}
.list{
line-height: 60px;
}
.navigation{
overflow: hidden;
}
.list li{
list-style: none;
float: left;
display: inline-block;
margin-left: 20px;
margin-right: 20px;
}
.list li a{
text-decoration: none;
color: #fff;
}
.list li a:hover{
}
.list li:not(:first-child) a:hover{
font-size: 26px;
color: #F5F5F5;
}
.logo{
font-size: 26px;
font-weight: 700;
}
.container{
min-height: 500px;
text-align: center;
width: 100%;
}
.footer{
width: 100%;
height: 50px;
font-size: 22px;
background:#F5F5F5 ;
line-height: 50px;
}
.footer a{
color:#337aB7;
text-decoration: none;
}
.main{
color: #000000;
width: 96%;
margin: 30px auto;
}
.intro{
width: 100%;
margin:0 auto;
border-radius: 5px;
height: 300px;
background:#F5F5F5 ;
}
.userintro{
width: 100%;
margin:0 auto;
border-radius: 5px;
height: 200px;
background:#F5F5F5 ;
}
.welcome{
padding-top: 50px;
padding-left:50px;
font-size: 50px;
text-align: left;
padding-bottom: 0;
margin: 0;
}
.tech{
text-align: left;
padding-left:50px;
margin: 0;
}
.show{
overflow: hidden;
width: 100%;
}
.show li{
text-align: left;
font-size: 18px;
}
.col{
display: inline-block;
float: left;
width: 32%;
height: 100px;
overflow: hidden;
padding-right: 20px;
text-align: left;
text-overflow: ellipsis;
}
.author{
margin-top: 10px;
margin-bottom: 3px;
}
.btnlist{
padding-left: 50px;
text-align: left;
}
.login{
display: inline-block;
padding-left: 15px;
padding-right: 15px;
height: 38px;
line-height: 40px;
background: -webkit-gradient (linear, left top,
left bottom, from(#0068A6), to(#337aB7));
color: #fff;
text-align: center;
border-radius: 5px;
font-size: 20px;
font-weight: 600;
border: 1px solid #ccc;
text-decoration: none;
margin-right: 10px;
}
.register{
display: inline-block;
padding-left: 15px;
padding-right: 15px;
height: 38px;
line-height: 40px;
background: -webkit-gradient (linear, left top,
left bottom, from(#fff), to(#F5F5F5));
color: #000;
text-align: center;
border-radius: 5px;
font-size: 20px;
font-weight: 600;
border: 1px solid #ccc;
text-decoration: none;
}
.field{
margin-top: 20px;
margin-left: 50px;
text-align: left;
margin-bottom: 20px;
border:none;
border-bottom: 1px solid #ccc;
}
.label{
font-size: 18px;
font-weight: 600;
line-height: 100%;
display: inline-block;
width: 10%;
vertical-align: middle;
text-align: right;
padding-right: 10px;
}
.regheader{
text-align: left;
font-size: 24px;
font-weight: 600;
}
.regform{
text-align: left;
padding-left: 100px;
margin-bottom: 20px;
}
.regform input[type='text'],input[type='password']{
width: 200px;
height: 20px;
}
.regform input[type='submit']{
width: 120px;
height: 30px;
color: #fff;
background:-webkit-gradient(linear, left top,
left bottom, from(#0068A6), to(#337aB7));
border-radius: 5px;
font-size: 20px;
}
.item{
margin:20px;
width: 100%;
}
.mess{
font-size: 18px;
color: #E73C3C;
background: #F2DEDE;
border-radius: 5px;
width: 300px;
text-align: center;
margin-left: 100px;
}
.indexmes{
height: 30px;
line-height: 30px;
background: #F2DEDE;
color: #E73C3C;
}
.article{
width: 60%;
height: 30px;
border-radius: 3px;
border: 1px solid #A3C732;
margin-top: 5px;
font-size: 20px;
}
.submit{
height: 40px;
vertical-align: middle;
padding: 0;
margin-top: -5px;
margin-left: 5px;
width: 80px;
background: #A3c732;
font-size: 20px;
border: none;
border-radius: 5px;
color: #fff;
}
.submitform{
margin-top: 25px;
margin-left: -10px;
}
.userlink{
display: inline-block;
text-decoration: none;
line-height: 38px;
height: 38px;
vertical-align: middle;
padding: 0;
margin-top: -8px;
margin-left: 5px;
width: 90px;
text-align: center;
background: #A3c732;
font-size: 20px;
font-weight: 600;
border-radius: 5px;
color: #fff;
border: 1px solid #ccc;
}
.usertitle{
text-align: left;
padding-top: 5px;
padding-bottom: 0;
padding-left: 5px;
margin-bottom: 8px;
}
.usersuccess{
height: 30px;
background: #DFF0D8;
line-height: 30px;
color: #3C7668;
} |
Õâ¸öcssÎļþÊÇÏîÄ¿ÖÐËùÓеÄcssÈ«²¿°üº¬ÔÚÕâÀËùÒԱȽÏÅÓ´ó¡£µ½Ä¿Ç°ÎªÖ¹£¬¿ÉÒԲ鿴Ê×ҳЧ¹ûÈçÏ£º

Ê×Ò³ÖеÄÊý¾Ý¶¼ÊÇ֮ǰ×Ô¼º²âÊÔ¹ý³ÌÖмÓÈëµÄ£¬ÕâÀïÖ÷ҪΪÁ˲鿴Ê×ҳЧ¹û£¬¿ÉÒÔºöÂÔÕâЩÊý¾Ý¡£
ÓÉÓÚÕâÀïÒªÑÝʾÓû§×¢²áµÇ¼ģ¿é£¬Óû§×¢²áÄ£¿éµÄÄ£°åÎļþreg.jadeÈçÏ£º
extends layout
block content
h3.field.regheader #{title}
form.regform(method='post')
p.mess #{message}
div.item
label.label(for='username') Óû§Ãû
input(type='text',placeholder= 'ÊäÈë×¢²áÓû§Ãû', id='username', name='username')
div.item
label.label(for='password') Óû§ÃÜÂë
input(type='password',placeholder='Óû§ÃÜÂë' ,id='password',name='password')
div.item
label.label(for='passwordconf') ÖØ¸´ÃÜÂë
input(type='password',placeholder='ÖØ¸´ÃÜÂë', id='passwordconf',name='passwordconf')
div.item
label.label
input(type='submit' id='sub',name='sub' value='×¢²á') |
Óû§µÇ½ģ°ålogin.jadeÈçÏ£º
extends layout
block content
h3.field.regheader #{title}
form.regform(method='post')
p.mess #{message}
div.item
label.label(for='username') Óû§Ãû
input(type='text', placeholder='ÊäÈëµÇ½Óû§Ãû', id='username',name='username')
div.item
label.label(for='password') Óû§ÃÜÂë
input(type='password', placeholder='Óû§ÃÜÂë', id='password',name='password')
div.item
label.label
input(type='submit' id='sub',name='sub' value='怫') |
×îÖÕÓû§×¢²áЧ¹ûÈçÏ£º

Óû§µÇ¼ģ¿éºÍÕâ¸öЧ¹ûÏà·Â£¬¾Í²»²é¿´ÁË£¬ÉÙÁËÒ»¸öÖØ¸´ÃÜÂëµÄinput¶øÒÑ¡£
ÏÂÃæÎÒÃÇÐèÒª±àдÓû§×¢²áµÄÂß¼£¬ÔÚ±àдÓû§×¢²áÂß¼µÄǰ£¬Óû§Êý¾ÝÐèÒª³Ö¾Ã»¯£¬ËùÒÔÊ×ÏÈÒª°²×°MongoDBÊý¾Ý¿âÔÚ×Ô¼ºµÄ»úÆ÷ÉÏ£¬¹ØÓÚÆä°²×°Çë²Î¿¼Ö®Ç°µÄһƪ²©ÎÄ-windowsϵͳ°²×°MongoDB£¬
MongoDBÕâÖÖnosqlÀàÐ͵ÄÊý¾Ý¿â£¬·Ç³£ÊʺÏÓû§´æ´¢JSON¶ÔÏóÀàÐ͵ÄÊý¾Ý£¬ÓÐÁËmongoDB,¾Í¿ÉÒÔÃâÈ¥Êý¾Ý¿â±íÉè¼Æ²¿·ÖµÄ¹¤×÷£¬¶Ô±ÈÒÔǰʹÓõÄmysql,sqlserverÒÔ¼°oracle»¹ÊǷdz£·½±ãµÄ¡£¹ØÓÚmongoDBÊý¾Ý¿âµÄÊìϤºÍѧϰ£¬ÍƼöÆä¹ÙÍø,¹ÙÍøÏêϸ½éÉÜÁ˸ÃÊý¾Ý¿âµÄÒ»ÇС£Ó¢ÎIJ»ºÃ¿ÉÒÔÈ¥ÖÐÎÄÉçÇø¡£Í¬Ê±ÎªÁËʹÓÃnodejsÀ´²Ù×÷mongoDBÊý¾Ý¿â£¬ÎÒÃÇʹÓÃmongooseÕâ¸ö¶ÔÏóÄ£ÐÍ£¬ËüÊǽ«mongoDBÖеÄÒ»¸ö¼¯ºÏÓ³ÉäΪnodejsÖеÄÒ»¸ömodel£¬È»ºóÔÚ¸ÃmodelÉÏÌṩ²Ù×÷Õâ¸ö¼¯ºÏµÄһЩ·½·¨£¬Ê¹ÓÃËü¾Í¿ÉÒÔ±ÜÃâÎÒÃÇ×Ô¼ºÀûÓÃnodejsÌṩµÄÔÉú²Ù×÷mongoDBÊý¾Ý¿âµÄÓ﷨ȥÊÖдÊý¾Ý¿âCURDµÄ·½·¨£¬´ó´ó¼ûɹÁ˹¤×÷Á¿£¬Ìá¸ßÁË¿ª·¢Ð§ÂÊ¡£¹ØÓÚmongooseµÄѧϰ£¬ÍƼöÈ¥Æä¹ÙÍø£¬ÀïÃæÏêÊöÁËËüµÄ°²×°£¬Ê¹ÓÃÒÔ¼°APIµ÷ÓÃÇé¿ö¡£
½â¾öÁËmongoDB°²×°ºÍ²Ù×÷ÎÊÌ⣬ÎÒÃÇÀ´¶ÔÊý¾Ý¿â²Ù×÷µÄmodelÀ࣬Ê×ÏÈÔÚÏîĿ·¾¶Ï½¨Á¢Ò»¸ödb.jsÎļþ£¬ÓÃÀ´Á¬½ÓÊý¾Ý¿â²¢¶ÔÊý¾Ý¿â½øÐÐÈ«¾ÖÅäÖã¬ÈçÏÂ
db.js
var settings=require("./settings");
var mongoose=require('mongoose');
mongoose.connect("mongodb://"+settings.ip+"/"+settings.db);
var db=mongoose.connection;
module.exports={ "dbCon":db,
"mongoose":mongoose
}; |
ÕâÀïÊ×ÏȼÓÔØÁËÅäÖÃÎļþsettings.jsÎļþ£¬ÎªÁËÊý¾Ý¿â±ãÓÚÁé»îÐ޸ģ¬ÎÒÃǽ«Ä³Ð©ÐÅÏ¢´æ´¢ÔÚÅäÖÃÎļþÖС£È»ºó¼ÓÔÚÁË֮ǰ°²×°µÄmongooseÄ£¿é£¬È»ºóµ÷ÓøÃÄ£¿éµÄconnect·½·¨À´Á¬½ÓÎÒÃÇÅäÖõÄÊý¾Ý¿â£¬È»ºó½«Á¬½ÓÒÔ¶ÔÏóµÄÐÎʽ·µ»Ø¹©Íⲿµ÷Óá£
settings.js
module.exports={
"ip":"localhost", "db":"microblog",
"host":27071
}; |
MongoDBµÄĬÈ϶˿ÚÊÇ27071£¬Ò»°ã¿ÉÒÔʹÓÃĬÈ϶˿ڼ´¿É£¬Êý¾Ý¿âÁ¬½Ó´óʱºò¿ÉÒÔ²»Ö¸¶¨¶Ë¿Ú£¬Êý¾Ý¿âÃûΪmicroblog.
È»ºóÒÔdb.js·µ»ØµÄÊý¾Ý¿âÁ¬½Ó¶ÔÏóΪ»ù´¡£¬ÎÒÃÇÔÚÏîÄ¿¸ùĿ¼Ï´´½¨Ò»¸ömodelsÎļþ¼Ð£¬ÓÃÀ´´æ·ÅÊý¾ÝÄ£ÐÍ¡£´´½¨Ò»¸öuser.jsÓ³ÉäÎÒÃÇÊý¾Ý¿âÖеÄuser¼¯ºÏ£¨¿ÉÒÔÀí½âΪuser±í£©£¬´úÂëÈçÏ£º
var mongoose=require('../db').mongoose;
var schema=new mongoose.Schema({
name:'string',
password:'string'
});
var User=mongoose.model('User',schema);
module.exports=User; |
ÕâÀïÊ×ÏÈ»ñµÃdb.jsÖж¨ÒåµÄÁ¬½Ó¶ÔÏ󣬲¢ÒԸöÔÏóΪ»ù´¡¹¹ÔìÒ»¸öSchema£¨¼Ü¹¹£©£¬mogoose²Ù×÷Êý¾Ý¿âÊÇÒԼܹ¹Îª»ù´¡µÄ£¬ÀàËÆÓÚÎÒÃÇÆäËûORMÄ£ÐÍÖÐÊôÐԺͷ½·¨µÄ¶¨Òå¡£ÕâÀïÎÒÃǶ¨ÒåÁËÒ»¸ö¼Ü¹¹£¬ÓµÓÐÁ½¸öÊôÐÔ£¬nameºÍpassword£¬¶¼ÊÇstringÀàÐÍ£¬¶ÔÓ¦Óû§µÄÓû§ÃûºÍÃÜÂ롣ȻºóÀûÓøüܹ¹È¥´´½¨Ò»¸ömodel£¬¸ÃmodelÉ϶¨ÒåÁ˶ÔÊý¾Ý¼¯ºÏµÄÔöɾ¸Ä²éµÈ·½·¨£¬²»ÓÃÎÒÃÇ×Ô¼ºÔÙÈ¥¶¨ÒåºÍ±àдÆäËû´úÂë¡£ÔÚÔÊéÖÐÕâÒ»½ÚÊÇÀûÓÃnode.js²Ù×÷MongoDBÊý¾Ý¿âµÄÔÉúAPIÈ¥¶¨ÒåÁËÒ»¸öuser¶ÔÏó£¬È»ºóÔÚuser¶ÔÏóÉÏ×Ô¶¨ÒåÁËһЩCRUDµÄ·½·¨¡£¿ÉÒÔ¿´³ö£¬Ö±½ÓʹÓÃMongoose¿ÉÒÔ´ó´ó¼õÉÙ¿ª·¢Á¿²¢ÇÒÓµÓиüºÃµÄЧÂʺÍÐÔÄÜ¡£
µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃÇÒѾÓÐÁ˽çÃæ£¨view£©£¬Êý¾ÝÄ£ÐÍ£¨model£©£¬¾Í²îÂß¼´úÂ루controller£©Ã»ÓбàдÁË¡£ÔÚ±àдÂß¼´úÂë֮ǰÐèÒªÏÈ˵ÏÂexpress¿ò¼ÜµÄÌØµãÒÔ¼°ËüµÄÕûÌåÔËÐз½Ê½¡£ÓÉÓÚ±¾ÈËʹÓùýһЩÀàËÆµÄÈçAsp.net
mvc£¬YiiÒÔ¼°thinkphpµÈMVC¿ò¼Ü£¬Ê¹ÓÃexpressÖ®ºó×î´óµÄ¸Ð¾õÊÇÕâ¸ö¿ò¼Ü¹»ÇáÁ¿¼¶£¬ÓÈÆäÊÇexpress4.XÖ®ºó£¬Ëü½ö½ö±£ÁôÁ˾²Ì¬Îļþ·¾¶Ó³ÉäÄ£¿é×÷Ϊ¸Ã¿ò¼Ü±¾ÉíµÄÄÚÖÃÄ£¿é£¬ÆäËûµÄ¹¦Äܶ¼ÒÔÖмä¼þµÄÐÎʽ²ÉÓÃrequire(modulename)½øÐÐÒýÈ룬ֻÓÐÒýÈëºó²ÅÄܹ»Ê¹ÓøÃÄ£¿éÌṩµÄ¹¦ÄÜ¡£
expressµÄ¹¤×÷ÔÀíÊǿͻ§¶Ë·¢ËÍÒ»¸örequest£¬express½Óµ½¸ÃÇëÇ󣬿ÉÒÔ½«Ëü½øÐд¦ÀíÖ®ºó´«µÝ¸øÆäËûÖмä¼þ½øÐд¦Àí£¬×îÖÕ´¦ÀíÍê³ÉÖ®ºó£¬²ÉÓÃrespond.end»òÕßresponse.render½øÐÐÒ³ÃæäÖȾ»òÏìÓ¦£¬½øÐÐÒ³ÃæäÖȾµÄʱºò£¬²ÉÓòÎÊý´«µÝÒ³ÃæÐèÒªµÄÊý¾Ý¸ø¶ÔӦģ°åÒýÇæ£¬Ä£°åÒýÇæÊÕµ½Êý¾ÝÈ»ºó°´ÕÕ×Ô¼ºµÄÓï·¨½øÐÐÌæ»»Éú³É¶ÔÓ¦µÄhtml,×îÖÕ·µ»Ø¸øä¯ÀÀÆ÷½øÐÐäÖȾ¡£
ÔÚexpressÖУ¬×î¹Ø¼üµÄ²¿·Ö¾ÍÊÇ·ÓлúÖÆ£¬ÎÒÃÇËùÓлùÓÚÇëÇó×ö³öµÄÏìÓ¦¶¼ÊǶԸ÷ÓɽøÐмàÌý²¶»ñµÄ½á¹û¡£¾Ù¸öÀý×Ó£¬Èç¹ûÎÒÃÇÇëÇóÒ»¸ö·¾¶Îªhttp://localhost:3000/user,ÄÇô±ØÐëÔÚroutesÎļþ¼ÐÏÂÃæµÄ·¾¶¼àÌý£¨ÔÝÇÒ½Ð×ö¼àÌý°É£©µÄjsÎļþÖбàд¶Ô¸ÃÇëÇóµÄÏìÓ¦´úÂ룬ÖîÈçapp.post('/user',function(...){...})Ö®ÀàµÄ´úÂ룬Èç¹û²»´æÔÚÕâÑùµÄ´úÂ룬¾Í»á±¨Ò»¸ö404´íÎó£¬ÒòΪÇëÇóûÓеõ½ÏìÓ¦£¬expressʵÀý²»ÖªµÀÔõôȥÏìÓ¦Õâ¸öÇëÇó¡£ÒÔÉϾÍÊÇexpress´óÖµÄÔÀíºÍ¹¤×÷Á÷³Ì£¬¶ÔÓÚËüµÄѧϰ£¬ÍƼöÈ¥express¹ÙÍøÖ±½ÓÈ¥¿´Îĵµ£¬½²µÄºÜÏêϸ¡£
ÏÖÔڻص½Óû§×¢²áÄ£¿é£¬ÎÒÃÇ×¢²áÓû§³£¼ûµÄ×ö·¨ÊÇ×¢²á³É¹¦Ö®ºó¾ÍĬÈÏÓû§ÒѾµÇ¼£¬Ö±½ÓÌø×ªµ½»¶ÓµÇ½½çÃæ¡£ÔÚÕâÀïÎÒÃÇÐèÒª½«Óû§Êý¾ÝÔÚ×¢²á³É¹¦Ö®ºó±£´æÔÚsessionÖУ¬express¿ò¼Ü¶ÔÓÚsessionµÄÖ§³ÖÊÇͨ¹ýÖмä¼þexpress-sessionÀ´µÄ£¬Ê¹Ó÷½Ê½ÒÀÈ»ÊÇÔÚnpm
ϰ²×°£¬È»ºóÔÚÏîÄ¿Ö÷ÎļþÖÐʹÓÃrequire¼ÓÔØ£¬×îºóµ÷ÓÃÆäÌṩµÄAPI£¬ÎªÁËʹÓÃsession£¬±ØÐëÏȰ²×°cookieµÄÖ§³Ö£¬ÕâÀïÀûÓÃcookie-parserÕâ¸öÖмä¼þÀ´Îªexpress¿ò¼ÜÌṩcookieÖ§³Ö£¬ËüµÄ¾ßÌåʹÓ÷½Ê½¿ÉÒÔÈ¥ÉÏÃæÌṩµÄµØÖ·×ÔÐв鿴¡£¶ÔÓÚsession£¬ÎÒÃdz£¼û¿ò¼ÜµÄ×ö·¨ÊÇÔÚ·þÎñÆ÷¶Ë½«Æä´æ·Åµ½Îļþµ±ÖУ¬ÓÉÓÚÕâÀïÎÒÃÇÓÐÁËMongoDBÊý¾Ý¿â£¬¸üÀíÏëµÄ״̬Êǽ«Ëü´æÔÚÊý¾Ý¿âÖУ¬ÕâÑù¿ÉÒÔ¸üÁé»îÈ¥¿ØÖÆ¡£Ê¹ÓÃconnect-mongoÖмä¼þ¿ÉÒÔ½«session´æ´¢µ½mongoDBÖУ¬¾ßÌåʹÓ÷½Ê½¿É°´µØÖ·²é¿´¡£
ÉÏÊö¸ÅÄîÃ÷È·Ö®ºó£¬ÎÒÃÇÔÚÏîÄ¿¸ùĿ¼ÏµÄapp.js(ÏîÄ¿Èë¿ÚÎļþ)ÖмÓÔØÎÒÃÇÐèÒªµÄÖмä¼þÄ£¿éºÍ×Ô¶¨ÒåµÄÄ£¿éÈçÏ£º
app.jsÄ£¿é¼ÓÔØ´úÂ룺
var express
= require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var session = require("express-session");
var MongoStore= require('connect-mongo')(session);
var db = require('./db');
var app = express();
// view engine setup
app.set ('views', path.join(__dirname, 'views'));
app.set ('view engine', 'jade');
// uncomment after placing your favicon in
/public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false
}));
app.use(cookieParser());
app.use (express.static(path.join(__dirname,
'public')));
app.use(session({
secret:"myzhibie",
store:new MongoStore({
mongooseConnection:db.dbCon
})
}));
app.use('/', routes);
app.use('/users', users); |
ÉÏÊö´úÂë¾ÍÊǼÓÔØ¸÷¸öÖмä¼þÄ£¿é²¢²ÉÓÃapp.useÀ´loadÕâ¸öÄ£¿é£¬ÆäÖÐÉÏÊö´úÂëµÄ×îºóÒ»Ö¸¶¨Á˽«session´æ´¢ÔÚMongoDBÊý¾Ý¿âÖУ¬secretÊôÐÔÊǶÔsessionµÄÇ©Ãû£¬Í¨³£ÊÇÒ»¸ö×Ö·û´®£¬ÕâÊDZØÑ¡ÏÈç¹û²»Ð´£¬
ÊÇÎÞ·¨Íê³É½«session´æ´¢½øÈëÊý¾Ý¿âµÄ£¬¹ØÓڸù¦ÄܵĸüÏêϸ½éÉÜÇë²é¿´Îĵµ£¬×îºóÁ½¾äapp.use('/',routes)ºÍapp.use('/users',users)´ú±í¶ÔÓÚÕâÁ½¸ö·ÓɵķÃÎÊ´¦Àí´úÂëÎÒÃÇ·â×°ÔÚÁËroutesºÍusersÄ£¿éÖУ¬erÕâÁ½¸öÄ£¿é¶¼ÔÚroutesÎļþ¼ÐÏÂÃæ¡£
Íê³ÉÁËÄ£¿éÒýÈë¼ÓÔØºÍһЩ»ù±¾µÄÉèÖã¬ÏÖÔÚÀ´±àдÓû§×¢²áµÄÂß¼´úÂ룬ÉÏÃæËµµ½¶ÔÓÚ·¾¶/µÄ·ÃÎÊ´¦ÀíÔÚroutesÄ£¿éÖУ¬Õâ¸öÄ£¿éÖ¸µÄ¾ÍÊÇroutesÎļþ¼ÐÏÂÃæµÄindex.js£¬²¿·Ö´úÂëÈçÏ£º
1 var express
= require('express');
2 var crypto = require('crypto');
3 var router = express.Router();
4 var db=require('../db');
5 var User=require('../models/user');
6 var Post=require('../models/post');
7 /* GET home page. */
8 router.get('/', function(req, res, next) {
9 Post.find({},function(err,posts){
10 if(err){
11 req.session.message=err.message;
12 return res.redirect('/');
13 }
14 res.render('index',{
15 posts:posts
16 });
17 });
18
19 });
20 //·¢±í΢²©
21 router.post('/post',function(req, res, next){
22 var currentUser=req.session.user;
23 var post=new Post({
24 user:currentUser.name,
25 post:req.body.article,
26 updated:getTime(new Date())
27 });
28 post.save(function(err){
29 if(err){
30 req.session.message=err.message;
31 return res.redirect('/reg');
32 }
33 req.session.success="·¢±í³É¹¦";
34 res.redirect ('/users/'+currentUser.name);
35 });
36
37
38 });
39
40 function getTime(date){
41 return date.getFullYear()+
42 "-"+date.getMonth()+1+"-"+
43 date.getDate()+" "+
44 date.getHours()+":"+
45 date.getMinutes();
46 }
47 router.get('/reg', isLogin);
48 //Óû§½øÈë×¢²áÒ³Ãæ
49 router.get('/reg',function(req,res){
50 res.render('reg',{title:"Óû§×¢²á"});
51 });
52 router.post('/reg', isLogin);
53 //Óû§µã»÷×¢²á°´Å¥
54 router.post('/reg',function(req,res){
55 if(req.body['password'] != req.body['passwordconf']){
56 req.session.error= "Á½´ÎÃÜÂë²»Ò»ÖÂ";
57 return res.redirect('/reg');
58 }
59 var md5= crypto.createHash('md5');
60 var password= md5.update (req.body.password).digest('base64');
61 var newUser=new User({
62 name:req.body['username'],
63 password:password
64 });
65 User.findOne ({name:newUser.name} ,function(err,user){
66 if(user){
67 err="Óû§ÃûÒѾ´æÔÚ";
68 }
69 if(err){
70 req.session.error=err;
71 return res.redirect('/reg');
72 }
73 newUser.save(function(err){
74 if(err){
75 req.session.error=err.message;
76 return res.redirect('/reg');
77 }
78 req.session.user=newUser;
79 req.session.success="×¢²á³É¹¦";
80 res.redirect('/');
81 });
82 });
83 });
84 router.get('/login',isLogin);
85 router.get('/login',function(req,res){
86 res.render('login',{title:"Óû§µÇ½"});
87 });
88 router.post('/login',isLogin);
89 router.post('/login',function(req,res){
90 var md5=crypto.createHash('md5');
91 var password=md5.update (req.body.password) .digest('base64');
92 User.findOne ({name:req.body.username} ,function(err,user){
93 if(!user){
94 req.session.error="Óû§²»´æÔÚ";
95 return res.redirect('/login');
96 }
97 if(user.password!=password){
98 req.session.error="ÃÜÂë´íÎó";
99 return res.redirect('/login');
100 }
101 req.session.user=user;
102 req.session.success="µÇ¼³É¹¦";
103 res.redirect('/');
104 });
105 });
106 router.get ('/logout',function(req,res){
107 req.session.user=null;
108 res.redirect('/');
109 });
110 function isLogin (req,res,next){
111 if(req.session.user){
112 req.session.message="Óû§ÒѵǼ";
113 return res.redirect('/');
114 }
115 next();
116 }
117 module.exports = router; |
ÉÏÊö´úÂë1-6Ðж¼ÊǶÔÍⲿģ¿éµÄÒýÈ룬8-19ÐÐÊǶÔÊ×ҳ·ÓÉ/µÄ´¦Àí´úÂë¡£117Ðн«¸ÃÄ£¿é¶¨ÒåΪrouter¹©Íⲿµ÷Óá£ÎÒÃÇÖ÷Òª¿´54-83ÐУ¬ÕâЩ´úÂë¾ÍÊÇÓû§×¢²áµÄ´úÂ룬54ÐмàÌýÀ´×ÔÓû§¶ÔÓÚ/reg·ÓɵÄpostÇëÇó£¬Ê×ÏÈÅжÏÁ½´ÎÃÜÂëÊÇ·ñÒ»Ö£¬Èç¹û²»Ò»ÖÂÔÚsessionÖд洢һ¸ö´íÎóÐÅϢȻºóÌø×ªµ½µ½µ±Ç°Ò³ÃæÏÔʾ´íÎóÐÅÏ¢£¬¸Ã´íÎóÐÅÏ¢¹©Ä£°åÒýÇæÏÔʾ¸øÓû§¡£Èç¹ûÁ½´ÎÃÜÂëÒ»ÖÂÊ×ÏȶÔÃÜÂë½øÐÐmd5¼ÓÃÜ£¬Ê¹ÓõÄÊÇnodejsÌṩµÄºËÐÄÄ£¿écrypto£¬²¢Éú³ÉÒ»¸ö¶ÔÏóÄ£ÐÍUser£¬¸Ã¶ÔÏóÄ£ÐÍÊÇmongooseÖÐÌṩµÄÒ»¸ömodelµÄʵÀý£¬mongooseÔÚËüÉÏÃæ¶¨ÒåÁËһЩ²Ù×÷Êý¾Ý¿âµÄ·½·¨¡£È»ºóµ÷ÓÃÕâ¸öʵÀýµÄfindOne·½·¨¼ì²â¸ÃÓû§ÊÇ·ñÒѾ´æÔÚ£¬Èç¹û´æÔھͱ£´æ´íÎóÐÅÏ¢µ½session²¢Ìø×ªµ½µ±Ç°Ò³ÏÔʾ´íÎó¡£Èç¹û²»´æÔÚÕâÑùÒ»¸öÓû§¾ÍʹÓÃsave·½·¨½øÐÐÓû§ÐÅÏ¢±£´æ£¬×¢²á³É¹¦ºó½«Óû§ÐÅÏ¢±£´æÔÚsessionÖУ¬²¢±£´æÒ»¸ösuccessµÄÌáʾÐÅÏ¢£¬È»ºóÌø×ªµ½Ê×Ò³¡£ÕâÀïÐèҪעÒâÒ»¸ö¿Ó£¬ÒÔǰ×öphp»òÕß.netµÄʱºò£¬ÎÒÃÇͨ³£¶¼ÊÇÏȲéѯÊý¾Ý¿âµÈÊý¾Ý¿â·µ»Ø½á¹ûÌáʾÓû§ÊÇ·ñ´æÔÚÖ®ºóÔÙ½øÐÐÓû§µÄsaveÈ»ºóÔÚÌø×ª£¬ÕâÊÇÒ»ÖÖͬ²½·½Ê½£¬Ìø×ª²Ù×÷ÐèÒªµÈ´ýfindOne²Ù×÷·µ»Ø½á¹ûÖ®ºó²ÅÄܽøÐС£¶ønodejsÖвÉÓÃÒì²½IO£¬×îºóµÄÌø×ª²Ù×÷ÐèÒª·ÅÔÚfindOne²Ù×÷µÄ»Øµ÷º¯ÊýÖнøÐУ¬Ìø×ª²Ù×÷²»±ØµÈ´ýfindone²Ù×÷½áÊøºóÖ´ÐУ¬Á½ÕßÊÇÒì²½µÄ¡£Èç¹û½«×îºóµÄredirect²Ù×÷·ÅÔÚfindOne²Ù×÷Íⲿ¶ø²»Êǻص÷º¯ÊýÖУ¬Äã»áÔÚ¿ØÖÆÌ¨Éϵõ½Ò»¸öCan't
set headers after they are sentµÄ´íÎó£¬ÕâÊÇÒòΪÔÚfineOneÒÔ¼°save²Ù×÷֮ǰÒѾ½øÐÐÐÐÁËÌø×ª£¬responseÏìÓ¦ÒѾ½áÊø£¬²»Äܹ»Öظ´ÏìÓ¦ÇëÇó¡£
µ½Ä¿Ç°ÎªÖ¹£¬Óû§×¢²áÄ£¿é»ù±¾ÉÏÒѾ²î²»¶àÍê³ÉÁË£¬×îºóÐèҪ˵һÏÂÈçºÎÔÚÒ³ÃæÉÏÏÔʾÌáʾÐÅÏ¢»òÕß´íÎóÐÅÏ¢£¬Ö®Ç°ÎÒÃǽ«ÌáʾÐÅÏ¢»òÕß´íÎóÐÅÏ¢¶¼±£´æÔÚÁËsessionÖУ¬jadeÒªÏÔʾ´íÎóÐÅÏ¢£¬ËüÊDz»Äܹ»Ö±½Ó·ÃÎÊsessionµÄ£¬ÔÚexpress2.X¼´ÔÊéÖÐÊÇÀûÓÃreq.flash
API+¶¯Ì¬ÊÓͼÖúÊÖÀ´ÊµÏֵ쬾ÍÊÇ·¢Éú´íÎóµÄʱºòÏȽ«ÆäÀûÓÃreq.flash·½·¨´æ´¢ÏÂÀ´£¬È»ºóÀûÓö¯Ì¬ÊÓͼÖúÊÖ½áºÏÄ£°åÈ¥äÖȾ¸øÓû§¡£express4.X·ÏÆúÁËÕâÖÖ·½Ê½£¬ÎÒÃÇ¿ÉÒÔÀûÓÃreq.flash
µÄÔÀíÀ´×Ô¼ºÄ£ÄâÒ»¸öÕâÖÖ»úÖÆ£¬Í¬Ê±ÀûÓÃres.locals±äÁ¿±»±£´æÆðÀ´£¬Ä£°åÔÚäÖȾµÄʱºòÊÇÄܹ»·ÃÎʵ½·þÎñ¶ËÕâ¸ö±äÁ¿µÄ¡£¹ØÓÚres.localsµÄ¸ü¶à½éÉÜÇë²é¿´Îĵµ¡£
ΪÁËÄ£ÄâÕâÖÖreq.flash»úÖÆ£¬ÎÒÃÇÔÚÏîÄ¿Èë¿ÚÎļþapp.js£¨ÏîÄ¿¸ùĿ¼Ï£©Ìí¼ÓÒ»¶Î´úÂëÈçÏ£º
1 app.use(function(req,res,next){
2 // res.locals.user=req.session.user;
3 var err=req.session.error;
4 var success=req.session.success;
5 var user=req.session.user;
6 var mess=req.session.message;
7 delete req.session.success;
8 delete req.session.error;
9 delete req.session.message;
10 if(err){
11 res.locals.message="*"+err;
12 }
13 if(mess){
14 res.locals.message="*"+mess;
15 }
16 if(success){
17 res.locals.success=success;
18 }
19 if(user){
20 res.locals.user=user.name;
21 }
22 next();
23 }); |
Õâ¶Î´úÂëµÄÒâ˼ÊÇÓû§ÇëÇóºÍÏìÓ¦µÄʱºò£¬²¶»ñsessionÖд洢µÄ´íÎóÐÅÏ¢ºÍÓû§Ìáʾ£¬½«Æä´æ´¢ÔÚresponse.locals±äÁ¿ÖУ¬ÕâÑùÄ£°å¾ÍÄܹ»»ñÈ¡¡£¶ÔÓÚ´íÎóÐÅÏ¢ºÍÌáʾ£¬ÓÉÓÚֻʹÓÃÒ»´Î£¬´æ´¢ºóÁ¢¼´Ê¹ÓÃdeleteɾ³ý£¬¶ÔÓÚÓû§ÐÅÏ¢£¬ÐèÒª³Ö¾Ã±£´æÏÂÀ´£¬Ôò²»É¾³ý¡£
ÕâÑù£¬¾ÍÄܹ»ÏÔʾÓû§Ìáʾ»òÕß´íÎóÐÅÏ¢¡£
ÏÂÃæÑÝʾһÏÂÍêÕûµÄÓû§×¢²áÁ÷³ÌÒÔ¼°´íÎóÐÅÏ¢Ìáʾ¡£
µ±Óû§Ãû´æÔÚ»òÃÜÂë²»Ò»ÖÂʱ£¬

µ±×¢²á³É¹¦ºóÌø×ªµ½Ê×Ò³²¢ÏÔʾÓû§×¢²á³É¹¦

ͬʱ¶ÔÓÚ×¢²á³É¹¦ºÍµÇ½³É¹¦ÓµÓв»Í¬Ìáʾ£¬Èç¹û¸ÃÓû§ÒѾÊǵǼ״̬ÔòÏÔʾÍ˳öºÍ·¢±íÎÄÕ°´Å¥£¬Èç¹ûûÓеǼ£¬ÔòÏÔʾµÄÊǵǽºÍÁ¢¼´×¢²á°´Å¥¡£
ÒÔÉϾÍÊÇÀûÓÃnodejs¼°express£¬mongoose£¬mongoDB,jade½øÐÐweb¿ª·¢µÄÖ÷ÒªÁ÷³Ì£¬ÓÉÓÚ¸ÃÏîÄ¿ÊǶÔnodejs
web¿ª·¢Ö¸ÄÏÒ»ÊéÖÐ΢²©ÏîÄ¿µÄÖØ¹¹£¬ËùÒÔÍêÕû°æµÄÏîÄ¿´úÂ뻹ÓÐÓû§È¨ÏÞ¿ØÖÆ£¨ÒѵǼÓû§²»Äܹ»×¢²á»òµÇ½²¢Ìáʾ£©£¬Óû§½øÈë¸öÈËÒ³Ãæ·¢²¼Î¢²©²¢ÁбíÏÔʾ£¬Í¬Ê±Ê×Ò³ÏÔʾ×î½ü·¢²¼µÄ΢²©ÐÅÏ¢µÈ¹¦ÄÜ¡£ÍêÕû°æ´úÂëµãÕâÀÓÉÓÚÆª·ùÒÔ¼°Ê±¼äÎÊÌ⣬ÉÏÊöÒªµã²»¿ÉÄÜÒ»Ò»Õ¹¿ªÌÖÂÛ£¬±¾ÎľÍ×÷Ϊһ¸öÌá¸Ù£¬ÊǶÔnodejs
web¿ª·¢µÄÒ»¸ö×ÛÊö¡£ |