【NodeJS 学习笔记03】先运行起来再说
<h1>前言</h1><p>最近同事推荐了一个不错的网址:https://github.com/nswbmw/N-blog/wiki/_pages</p>
<p>里面的教程很是详细,我们现在跟着他的节奏学习下NodeJS,一个简单的博客</p>
<p>我们这次来个过年七天乐......看看能不能nodeJS来个入门</p>
<h1>让nodeJS跑起来</h1>
<p>第一步当然是安装nodeJS环境了,现在windows安装nodeJS比较快了,直接下载即可:</p>
<p>http://www.nodejs.org/download/</p>
<p>这里根据需要下载,下载完成后直接下一步下一步即可,完了我们就具有nodeJS环境了</p>
<p>第二步,为了方便我们后面操作,我们直接在D盘见了一个文件夹blog</p>
<p>然后打开windows命令行工具,进入d盘,输入:</p>
<div class="cnblogs_code">
<pre>express -e blog</pre>
</div>
<p>然后里面可能有依赖包,我们需要进入blog目录安装(安装的配置由package.json提供):</p>
<div class="cnblogs_code">
<pre>npm install</pre>
</div>
<p>这个样子,我们依赖包就下载下来了,其中依赖包与java的包文件,.net的bll文件应该是一个概念</p>
<p>这个时候,我们的程序已经可以运行了:</p>
<div class="cnblogs_code">
<pre>node app</pre>
</div>
<div class="cnblogs_code">
<pre>D:\blog><span style="color: rgba(0, 0, 0, 1)">node app
Express server listening on port </span>3000</pre>
</div>
<p>这个时候打开浏览器就有反应了:</p>
<p><img src="//images0.cnblogs.com/blog/294743/201401/291331283599809.png" alt=""></p>
<p>这里我们使用的是express(一个流行的nodeJSweb开发框架),并且使用了ejs模板引擎</p>
<h1>文件结构</h1>
<p>初始化文件目录结构如下:</p>
<p><img src="//images0.cnblogs.com/blog/294743/201401/291335011099679.png" alt=""></p>
<p>app.js 为入口文件</p>
<p>package.json 为模块依赖文件,我们使用npm install时候他会以其配置在网上下载相关包</p>
<p>node_modules 为下载下来的模块文件(package.json)</p>
<p>public 存放静态资源文件</p>
<p>routes 存放路由文件</p>
<p>views 存放相关视图模板文件</p>
<p>这个样子,我们基本目录结构就出来了,我们这里先简单说下node_modules这个目录</p>
<h2>node_modules/ejs</h2>
<p><span style="line-height: 1.5">我们刚刚说了,这里面存放着下载下来的模块,说白了就是js文件集合</span></p>
<p><span style="line-height: 1.5"><img src="//images0.cnblogs.com/blog/294743/201401/291340488757536.png" alt=""></span></p>
<div class="cnblogs_code"><img id="code_img_closed_583048b0-06af-400c-82fe-c3d6f21f8004" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_583048b0-06af-400c-82fe-c3d6f21f8004" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_583048b0-06af-400c-82fe-c3d6f21f8004" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">var</span> parse = exports.parse = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(str, options){
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">var</span> options = options ||<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> , open = options.open || exports.open || '<%'
<span style="color: rgba(0, 128, 128, 1)"> 4</span> , close = options.close || exports.close || '%>'
<span style="color: rgba(0, 128, 128, 1)"> 5</span> , filename =<span style="color: rgba(0, 0, 0, 1)"> options.filename
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> , compileDebug = options.compileDebug !== <span style="color: rgba(0, 0, 255, 1)">false</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> , buf = ""<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> buf += 'var buf = [];'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">false</span> !== options._with) buf += '\nwith (locals || {}) { (function(){ '<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">11</span> buf += '\n buf.push(\''<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 255, 1)">var</span> lineno = 1<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 255, 1)">var</span> consumeEOL = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0, len = str.length; i < len; ++<span style="color: rgba(0, 0, 0, 1)">i) {
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 255, 1)">var</span> stri =<span style="color: rgba(0, 0, 0, 1)"> str;
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (str.slice(i, open.length + i) ==<span style="color: rgba(0, 0, 0, 1)"> open) {
</span><span style="color: rgba(0, 128, 128, 1)">19</span> i +=<span style="color: rgba(0, 0, 0, 1)"> open.length
</span><span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 255, 1)">var</span> prefix, postfix, line = (compileDebug ? '__stack.lineno=' : '') +<span style="color: rgba(0, 0, 0, 1)"> lineno;
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (str) {
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 255, 1)">case</span> '='<span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">24</span> prefix = "', escape((" + line + ', '<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">25</span> postfix = ")), '"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">26</span> ++<span style="color: rgba(0, 0, 0, 1)">i;
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 255, 1)">case</span> '-'<span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">29</span> prefix = "', (" + line + ', '<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">30</span> postfix = "), '"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">31</span> ++<span style="color: rgba(0, 0, 0, 1)">i;
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">34</span> prefix = "');" + line + ';'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">35</span> postfix = "; buf.push('"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">37</span>
<span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 255, 1)">var</span> end =<span style="color: rgba(0, 0, 0, 1)"> str.indexOf(close, i)
</span><span style="color: rgba(0, 128, 128, 1)">39</span> , js =<span style="color: rgba(0, 0, 0, 1)"> str.substring(i, end)
</span><span style="color: rgba(0, 128, 128, 1)">40</span> , start =<span style="color: rgba(0, 0, 0, 1)"> i
</span><span style="color: rgba(0, 128, 128, 1)">41</span> , include = <span style="color: rgba(0, 0, 255, 1)">null</span>
<span style="color: rgba(0, 128, 128, 1)">42</span> , n = 0<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">43</span>
<span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ('-' == js){
</span><span style="color: rgba(0, 128, 128, 1)">45</span> js = js.substring(0, js.length - 2<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">46</span> consumeEOL = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">47</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">48</span>
<span style="color: rgba(0, 128, 128, 1)">49</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (0 == js.trim().indexOf('include'<span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 128, 128, 1)">50</span> <span style="color: rgba(0, 0, 255, 1)">var</span> name = js.trim().slice(7<span style="color: rgba(0, 0, 0, 1)">).trim();
</span><span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (!filename) <span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Error('filename option is required for includes'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">52</span> <span style="color: rgba(0, 0, 255, 1)">var</span> path =<span style="color: rgba(0, 0, 0, 1)"> resolveInclude(name, filename);
</span><span style="color: rgba(0, 128, 128, 1)">53</span> include = read(path, 'utf8'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">54</span> include = exports.parse(include, { filename: path, _with: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, open: open, close: close, compileDebug: compileDebug });
</span><span style="color: rgba(0, 128, 128, 1)">55</span> buf += "' + (function(){" + include + "})() + '"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">56</span> js = ''<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">57</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">58</span>
<span style="color: rgba(0, 128, 128, 1)">59</span> <span style="color: rgba(0, 0, 255, 1)">while</span> (~(n = js.indexOf("\n", n))) n++, lineno++<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">60</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (js.substr(0, 1) == ':') js =<span style="color: rgba(0, 0, 0, 1)"> filtered(js);
</span><span style="color: rgba(0, 128, 128, 1)">61</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (js) {
</span><span style="color: rgba(0, 128, 128, 1)">62</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (js.lastIndexOf('//') > js.lastIndexOf('\n')) js += '\n'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">63</span> buf +=<span style="color: rgba(0, 0, 0, 1)"> prefix;
</span><span style="color: rgba(0, 128, 128, 1)">64</span> buf +=<span style="color: rgba(0, 0, 0, 1)"> js;
</span><span style="color: rgba(0, 128, 128, 1)">65</span> buf +=<span style="color: rgba(0, 0, 0, 1)"> postfix;
</span><span style="color: rgba(0, 128, 128, 1)">66</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">67</span> i += end - start + close.length - 1<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">68</span>
<span style="color: rgba(0, 128, 128, 1)">69</span> } <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (stri == "\\"<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">70</span> buf += "\\\\"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">71</span> } <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (stri == "'"<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">72</span> buf += "\\'"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">73</span> } <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (stri == "\r"<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">74</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ignore</span>
<span style="color: rgba(0, 128, 128, 1)">75</span> } <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (stri == "\n"<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">76</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (consumeEOL) {
</span><span style="color: rgba(0, 128, 128, 1)">77</span> consumeEOL = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">78</span> } <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">79</span> buf += "\\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">80</span> lineno++<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">81</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">82</span> } <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">83</span> buf +=<span style="color: rgba(0, 0, 0, 1)"> stri;
</span><span style="color: rgba(0, 128, 128, 1)">84</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">85</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">86</span>
<span style="color: rgba(0, 128, 128, 1)">87</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">false</span> !== options._with) buf += "'); })();\n} \nreturn buf.join('');"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">88</span> <span style="color: rgba(0, 0, 255, 1)">else</span> buf += "');\nreturn buf.join('');"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">89</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> buf;
</span><span style="color: rgba(0, 128, 128, 1)">90</span> };</pre>
</div>
<span class="cnblogs_code_collapse">View Code </span></div>
<p><span style="line-height: 1.5">就如,我们这里使用到的ejs模板以及express模块,然后我们好奇的走进了ejs的程序看看究竟有何不同</span></p>
<p><span style="line-height: 1.5">打开,ejs.js后,我们抽一点代码出来看:</span><span style="line-height: 1.5">这段代码我们比较熟悉,他与underscore的模板引擎代码思想一致,都是将模板解析为字符串</span></p>
<p>然后通过eval或者new Function的方法将之转换为函数,并且传入自己的数据对象好解析</p>
<p>至于具体工作流程,现在我们还不知道,只能放到后面点研究了,好了我们现在进入其他模块</p>
<h2>app.js</h2>
<p><span style="line-height: 1.5">作为入口文件,app.js扮演着举足轻重的角色:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 128, 0, 1)"> * Module dependencies.
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">var</span> express = require('express'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">var</span> routes = require('./routes'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">var</span> user = require('./routes/user'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">var</span> http = require('http'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">var</span> path = require('path'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">var</span> app =<span style="color: rgba(0, 0, 0, 1)"> express();
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> all environments</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> app.set('port', process.env.PORT || 3000<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">15</span> app.set('views', path.join(__dirname, 'views'<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">16</span> app.set('view engine', 'ejs'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">app.use(express.favicon());
</span><span style="color: rgba(0, 128, 128, 1)">18</span> app.use(express.logger('dev'<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">app.use(express.json());
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">app.use(express.urlencoded());
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">app.use(express.methodOverride());
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">app.use(app.router);
</span><span style="color: rgba(0, 128, 128, 1)">23</span> app.use(express.static(path.join(__dirname, 'public'<span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> development only</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ('development' == app.get('env'<span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)">app.use(express.errorHandler());
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">29</span>
<span style="color: rgba(0, 128, 128, 1)">30</span> app.get('/'<span style="color: rgba(0, 0, 0, 1)">, routes.index);
</span><span style="color: rgba(0, 128, 128, 1)">31</span> app.get('/users'<span style="color: rgba(0, 0, 0, 1)">, user.list);
</span><span style="color: rgba(0, 128, 128, 1)">32</span>
<span style="color: rgba(0, 128, 128, 1)">33</span> http.createServer(app).listen(app.get('port'), <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
</span><span style="color: rgba(0, 128, 128, 1)">34</span> console.log('Express server listening on port ' + app.get('port'<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">35</span> });</pre>
</div>
<p>我们通过require()命令加载express、http模块,并且会加载routes目录下index user等模板文件</p>
<p>app.set('port', process.env.PORT || 3000)为设置启动时候的端口</p>
<p>app.set('views', __dirname + '/views')为设置存放模板文件的路径,其中__dirname为全局变量,存放当前脚本所在目录,我们这样可以查看:</p>
<div class="cnblogs_code">
<pre>console.log(__dirname);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">index.js加入以下代码</span><span style="color: rgba(0, 128, 0, 1)">
/*</span><span style="color: rgba(0, 128, 0, 1)">*
D:\blog>node app
Express server li
D:\blog\routes
</span><span style="color: rgba(0, 128, 0, 1)">*/</span></pre>
</div>
<p>至于这个__dirname是如何获得的,我们暂时也不需要关注</p>
<p>app.set('view engine', 'ejs') 为设置模板引擎为ejs</p>
<p>app.use(express.favicon()) 是设置图标想修改的话就自己去搞public下面的images文件</p>
<p>app.use(express.logger('dev')); express依赖于connect这里就内建中间件会输出一些日志</p>
<p>app.use(express.json()); 用以解析请求体,这里就会把字符串动态转换为json对象</p>
<p>app.use(express.methodOverride()); connect内建中间件,用以处理post请求,并可以伪装put等http方法</p>
<p>app.use(app.router); 调用路由器解析规则</p>
<p><span style="line-height: 1.5">app.use(express.static(path.join(__dirname, 'public'))); connect内建中间件,设置根目录下的public存放静态文件</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> ('development' == app.get('env'<span style="color: rgba(0, 0, 0, 1)">)) {
app.use(express.errorHandler());
}</span></pre>
</div>
<p>这句话意思是开发状况下要输出错误信息</p>
<div class="cnblogs_code">
<pre>app.get('/'<span style="color: rgba(0, 0, 0, 1)">, routes.index);
app.get(</span>'/users', user.list);</pre>
</div>
<p>这两句都是访问时刻具体的处理文件了,比如这里直接访问时默认访问的是routes.index</p>
<p>然后其内部才真正解析模板数据:</p>
<div class="cnblogs_code">
<pre>exports.index = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
console.log(__dirname);
res.render(</span>'index', { title: 'Express'<span style="color: rgba(0, 0, 0, 1)"> });
};</span></pre>
</div>
<div class="cnblogs_code">
<pre>http.createServer(app).listen(app.get('port'), <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
console.log(</span>'Express server listening on port ' + app.get('port'<span style="color: rgba(0, 0, 0, 1)">));
});</span></pre>
</div>
<p>最后会调用上述代码创建http服务器并监听3000端口,成功后便可在网页上访问了</p>
<h1>路由</h1>
<p><span style="line-height: 1.5">前面我们使用这个方法构建路由</span></p>
<div class="cnblogs_code">
<pre>app.get('/', routes.index);</pre>
</div>
<p>上面代码可以使用这个代码取代(写在app里面)</p>
<div class="cnblogs_code">
<pre>app.get('/', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
res.render(</span>'index', { title: 'Express'<span style="color: rgba(0, 0, 0, 1)"> });
});</span></pre>
</div>
<p>这段代码的意思是访问主页时,调用ejs模板引擎,来渲染index.ejs模板文件</p>
<p>现在再做一点修改,以上代码实现了路由功能,但是我们不能将路由相关代码放到app中,路由多了后app就会变得臃肿,所以我们将相关配置放入index中</p>
<p>所以删除app中相关路由功能,在app结尾加入代码:</p>
<div class="cnblogs_code">
<pre>routes(app);</pre>
</div>
<p>然后修改index.js</p>
<div class="cnblogs_code">
<pre>module.exports = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(app) {
app.get(</span>'/', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
res.render(</span>'index', { title: 'Express'<span style="color: rgba(0, 0, 0, 1)"> });
});
};</span></pre>
</div>
<p>这个代码是怎么组织的现在还不清楚,也不去关注了,我们后面慢慢看</p>
<h2>路由规则</h2>
<p>express封装了多种http请求,我们一般使用get/post两种</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">app.get();
app.post();</span></pre>
</div>
<p>第一个参数为请求路径,第二个参数为回调函数,还是两个参数为request与response</p>
<p><span style="line-height: 1.5">然后,对于req(request)又有以下规则</span></p>
<p><span style="line-height: 1.5">req.query 处理get请求,获取get请求参数</span></p>
<p><span style="line-height: 1.5">req.params 处理/:xxx形式的get或者post请求</span></p>
<p><span style="line-height: 1.5">req.body 处理post请求,获取post请求体</span></p>
<p><span style="line-height: 1.5">req.params 处理get和post请求,但查找优先级为req.params->req.body->req.query</span></p>
<p><span style="line-height: 1.5">路径规则还支持正则,具体我们以后再说......</span></p>
<h2><span style="line-height: 1.5">添加路由规则</span></h2>
<p><span style="line-height: 1.5">当我们访问不存在的链接时:</span></p>
<p><span style="line-height: 1.5"><img src="//images0.cnblogs.com/blog/294743/201401/291505021729992.png" alt=""></span></p>
<p><span style="line-height: 1.5">因为不存在/y的路由规则,他也不说public下的文件,所以就404了</span></p>
<p><span style="line-height: 1.5">现在我们在index.js中添加相关路由:<br></span></p>
<div class="cnblogs_code">
<pre>module.exports = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (app) {
app.get(</span>'/', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
res.render(</span>'index', { title: 'Express'<span style="color: rgba(0, 0, 0, 1)"> });
});
app.get(</span>'/y', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
res.send(</span>'叶小钗'<span style="color: rgba(0, 0, 0, 1)">);
});
};</span></pre>
</div>
<p>这里我页面乱码了:</p>
<p><img src="//images0.cnblogs.com/blog/294743/201401/291512336255270.png" alt=""></p>
<p>原因是下载下来后,我的文件是gbk的编码,我们要将他改成utf-8就可以了,模板引擎这块我们就不管他了,我们进入下一节</p>
<h1>注册功能</h1>
<p><span style="line-height: 1.5">这里我们跟着原博主一起做一个注册的简单功能,这里使用mongo db作为数据库,后面我们再依次完善功能</span></p>
<p><span style="line-height: 1.5">新建一个register路由,并且为其新建register模板,于是我们开始吧</span></p>
<p><span style="line-height: 1.5">① 在index中新建路由</span></p>
<div class="cnblogs_code">
<pre>app.get('/register', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
res.render(</span>'index', { title: '注册页面'<span style="color: rgba(0, 0, 0, 1)"> });
});</span></pre>
</div>
<div class="cnblogs_code">
<pre>module.exports = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (app) {
app.get(</span>'/', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
res.render(</span>'index', { title: 'Express'<span style="color: rgba(0, 0, 0, 1)"> });
});
app.get(</span>'/y', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
res.send(</span>'叶小钗'<span style="color: rgba(0, 0, 0, 1)">);
});
app.get(</span>'/register', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
res.render(</span>'register', { title: '注册页面'<span style="color: rgba(0, 0, 0, 1)"> });
});</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(255, 255, 0, 1); color: rgba(0, 0, 0, 1)"><%</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> title </span><span style="background-color: rgba(255, 255, 0, 1); color: rgba(0, 0, 0, 1)">%></span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">link </span><span style="color: rgba(255, 0, 0, 1)">rel</span><span style="color: rgba(0, 0, 255, 1)">='stylesheet' </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">='/stylesheets/style.css' </span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(255, 255, 0, 1); color: rgba(0, 0, 0, 1)"><%</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> title </span><span style="background-color: rgba(255, 255, 0, 1); color: rgba(0, 0, 0, 1)">%></span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">form </span><span style="color: rgba(255, 0, 0, 1)">method</span><span style="color: rgba(0, 0, 255, 1)">="post"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>用户名:<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(255, 0, 0, 1)"> name</span><span style="color: rgba(0, 0, 255, 1)">="name"</span><span style="color: rgba(0, 0, 255, 1)">/></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>密码:<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="password"</span><span style="color: rgba(255, 0, 0, 1)"> name</span><span style="color: rgba(0, 0, 255, 1)">="password"</span><span style="color: rgba(0, 0, 255, 1)">/></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="submit"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="登陆"</span><span style="color: rgba(0, 0, 255, 1)">/></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>这个样子,我们页面就形成了:</p>
<p><img src="//images0.cnblogs.com/blog/294743/201401/291611578284120.png" alt=""></p>
<p>基本程序有了,我们现在需要数据库支持,于是我们要安装mongoDB环境</p>
<h2>MongoDB</h2>
<p><span style="line-height: 1.5">MongoDB是一个基于分布式文件存储的NoSQL的一种,由C++编写,MongoDB支持的数据结构松散,类似json,我们知道json可以支持任何类型,所以可以搞出很复杂的结构</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
id: </span>1<span style="color: rgba(0, 0, 0, 1)">,
name: </span>'叶小钗'<span style="color: rgba(0, 0, 0, 1)">,
frinds: [
{ id: </span>2, name: '素还真'<span style="color: rgba(0, 0, 0, 1)"> },
{ id: </span>3, name: '一页书'<span style="color: rgba(0, 0, 0, 1)"> }
]
}</span></pre>
</div>
<h2>安装MongoDB</h2>
<p><span style="line-height: 1.5">首先去http://www.mongodb.org/downloads下载安装文件,然后将文件拷贝到D盘改名mongodb,然后在里面新建blog文件夹<br></span></p>
<p><span style="line-height: 1.5">然后打开命令行工具将目录切换至bin,输入:</span> </p>
<div class="cnblogs_code">
<pre>mongod -dbpath d:\mongodb\blog</pre>
</div>
<p><span style="line-height: 1.5">设置blog文件夹为工程目录并启动数据库,为了方便以后我们写一个命令以后直接点击就启动数据库了:</span></p>
<div class="cnblogs_code">
<pre>d:\mongodb\bin\mongod.exe -dbpath d:\mongodb\blog</pre>
</div>
<h2>链接MongoDB</h2>
<p><span style="line-height: 1.5">数据库安装成功后,我们的程序还需要相关的“驱动”程序才能链接数据库,这个时候当然要下载包......</span></p>
<p><span style="line-height: 1.5">打开package.json在dependencies新加一行</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span>"name": "application-name"<span style="color: rgba(0, 0, 0, 1)">,
</span>"version": "0.0.1"<span style="color: rgba(0, 0, 0, 1)">,
</span>"private": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"scripts"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"start": "node app.js"<span style="color: rgba(0, 0, 0, 1)">
},
</span>"dependencies"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"express": "3.4.8"<span style="color: rgba(0, 0, 0, 1)">,
</span>"ejs": "*"<span style="color: rgba(0, 0, 0, 1)">,
</span>"mongodb": "*"<span style="color: rgba(0, 0, 0, 1)">
}
}</span></pre>
</div>
<p>然后运行npm install下载新的依赖包,这个样子与mongoDB相关的驱动就有了,要链接mysql等数据库还需要其他依赖包</p>
<p>这时在根目录下创建setting.js文件,保存数据库连接信息</p>
<div class="cnblogs_code">
<pre>module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
cookieSecret: </span>'myblog'<span style="color: rgba(0, 0, 0, 1)">,
db: </span>'blog'<span style="color: rgba(0, 0, 0, 1)">,
host: </span>'localhost'<span style="color: rgba(0, 0, 0, 1)">
}; </span></pre>
</div>
<p>db是数据库名称,host是数据库地址,cookieSecret用于cookie加密与数据库无关</p>
<p><span style="line-height: 1.5">接下来根目录下新建models文件夹,并在models文件夹下新建db.js</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> settings = require('../settings'<span style="color: rgba(0, 0, 0, 1)">),
Db </span>= require('mongodb'<span style="color: rgba(0, 0, 0, 1)">).Db,
Connection </span>= require('mongodb'<span style="color: rgba(0, 0, 0, 1)">).Connection,
Server </span>= require('mongodb'<span style="color: rgba(0, 0, 0, 1)">).Server;
module.exports </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Db(settings.db, <span style="color: rgba(0, 0, 255, 1)">new</span> Server(settings.host, Connection.DEFAULT_PORT), {safe: <span style="color: rgba(0, 0, 255, 1)">true</span>});</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">new</span> Db(settings.db, <span style="color: rgba(0, 0, 255, 1)">new</span> Server(settings.host, Connection.DEFAULT_PORT), { safe: <span style="color: rgba(0, 0, 255, 1)">true</span> });</pre>
</div>
<p>设置数据库名,数据库地址和数据库端口创建一个数据库实例,并通过module.exports导出实例,这样就可以通过require对数据库进行读写</p>
<p><span style="line-height: 1.5">需要成功写入数据库,服务器端程序就需要处理post信息,于是我们在models文件夹下新建user.js</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> mongodb = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./db</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
function User(user) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.name =<span style="color: rgba(0, 0, 0, 1)"> user.name;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.password =<span style="color: rgba(0, 0, 0, 1)"> user.password;
};
module.exports </span>=<span style="color: rgba(0, 0, 0, 1)"> User;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">存储用户信息</span>
User.prototype.save =<span style="color: rgba(0, 0, 0, 1)"> function (callback) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">要存入数据库的用户文档</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> user =<span style="color: rgba(0, 0, 0, 1)"> {
name: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.name,
password: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.password
};
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打开数据库</span>
<span style="color: rgba(0, 0, 0, 1)">mongodb.open(function (err, db) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> callback(err); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">错误,返回 err 信息</span>
<span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">读取 users 集合</span>
db.collection(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">users</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, function (err, collection) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
mongodb.close();
</span><span style="color: rgba(0, 0, 255, 1)">return</span> callback(err); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">错误,返回 err 信息</span>
<span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将用户数据插入 users 集合</span>
<span style="color: rgba(0, 0, 0, 1)"> collection.insert(user, {
safe: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
}, function (err, user) {
mongodb.close();
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> callback(err); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">错误,返回 err 信息</span>
<span style="color: rgba(0, 0, 0, 1)"> }
callback(</span><span style="color: rgba(0, 0, 255, 1)">null</span>, user[<span style="color: rgba(128, 0, 128, 1)">0</span>]); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">成功!err 为 null,并返回存储后的用户文档</span>
<span style="color: rgba(0, 0, 0, 1)"> });
});
});
};</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">读取用户信息</span>
User.get = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(name, callback) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打开数据库</span>
mongodb.open(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (err, db) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> callback(err);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">错误,返回 err 信息</span>
<span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">读取 users 集合</span>
db.collection('users', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (err, collection) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
mongodb.close();
</span><span style="color: rgba(0, 0, 255, 1)">return</span> callback(err);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">错误,返回 err 信息</span>
<span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查找用户名(name键)值为 name 一个文档</span>
<span style="color: rgba(0, 0, 0, 1)"> collection.findOne({
name: name
}, </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (err, user) {
mongodb.close();
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> callback(err);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">失败!返回 err 信息</span>
<span style="color: rgba(0, 0, 0, 1)"> }
callback(</span><span style="color: rgba(0, 0, 255, 1)">null</span>, user);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">成功!返回查询的用户信息</span>
<span style="color: rgba(0, 0, 0, 1)"> });
});
});
};</span></pre>
</div>
<p>这里一个写数据,一个读数据,处理程序有了,现在需要在index.js前面加上如下程序</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> User = require('../models/user.js');</pre>
</div>
<p>再修改其中的app.post('/register')</p>
<div class="cnblogs_code">
<pre>app.post('/register', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (req, res) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> name =<span style="color: rgba(0, 0, 0, 1)"> req.body.name;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> pwd =<span style="color: rgba(0, 0, 0, 1)"> req.body.password;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> newUser = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> User({
name: name,
password: pwd
});
newUser.save(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (err, user) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">相关操作,写入session</span>
<span style="color: rgba(0, 0, 0, 1)"> res.send(user);
});
});</span></pre>
</div>
<p>然后点击注册后便会有反应了</p>
<p><span style="line-height: 1.5"><img src="//images0.cnblogs.com/blog/294743/201401/301339567505074.png" alt=""><img src="//images0.cnblogs.com/blog/294743/201401/301340021255398.png" alt=""></span></p>
<p> </p>
<p><span style="line-height: 1.5">如果此时不能确定是否写入数据库,便可进入数据库查询一番,首先切换至数据库目录</span></p>
<div class="cnblogs_code">
<pre>D:\mongodb\bin></pre>
</div>
<p>输入:</p>
<div class="cnblogs_code">
<pre>mongo</pre>
</div>
<p>然后切换其数据库连接至blog</p>
<div class="cnblogs_code">
<pre>use blog</pre>
</div>
<p>最后输入</p>
<div class="cnblogs_code">
<pre>db.users.find()</pre>
</div>
<p><img src="//images0.cnblogs.com/blog/294743/201401/301344491879498.png" alt=""></p>
<p>我们大家就开心的看到数据写入了,于是今天的学习暂时告一段落</p>
<h1>结语</h1>
<p><span style="line-height: 1.5">今天我们跟着一篇博客完成了从安装到写入数据库的操作,明天让我们来将其它方面加入,逐步深化nodeJS的学习</span></p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<img id="view_img" src="https://img2022.cnblogs.com/blog/294743/202202/294743-20220216140902628-1163053035.png" width="80%" alt="" border="0"><br><br>
来源:https://www.cnblogs.com/yexiaochai/p/3527418.html
頁:
[1]