想了非常久。总想写点对大家有优点的,今天解说生成项目。

如今市面上一般须要人全栈-----mean(mongo,express。angular,nodejs),这样能够从前端开发到后端以及数据库,听起来牛呼呼的。

这篇文章就说nodejs和比較流行的框架express4.X版本号(因为3.X版本号没怎么研究过。并且和4有一定差别。况且4也出来非常久了。非用不可啊),后面的文章会带上mongo(oh。应该说是mongoose)至于angualr我有独立的研究过。和nodejs之流放在一起用还没搞过,还是看实际情况吧。

这篇文章就写个生成项目(页面就用ejs,对jade木有还没研究,不能坑了大伙)

众所周知,一个project肯定有非常多目录以及文件。那么怎么高速生成开发框架呢。两种方式,第一是使用工具,我用的是webstorm,另一个是语法,用命令操作到工作空间,然后运行命令  express  -e   aTest(当中-e就是指ejs。aTest是project名。也是最上层的目录名),为了可以形象化截图。我们还是用工具生成。

1:new一个project,各种开发都是从这里開始的

2:选nodeproject

3:选版本和驱动面板,版本不改,驱动面板改成ejs。点击ok

因为我们本地已经安装了nodejs。所以我们点击cancel

这样,一个nodejsproject生成了。例如以下图

文件夹解释

app.js:启动文件,或者说入口文件

package.json:存储着project信息以及模板依赖,当在dependencies中加入依赖的模块时。执行npm install,nmp会检查当前文件夹下的package.json,并自己主动安装全部指定的模块

node_modules:存放package.json中安装的模块,当你在package.json加入依赖的模块并安装后,存放在这个目录下

public:存放image、css、js等文件

routes:存放路由文件

views:存放视图文件或者说模板文件

bin:存放可运行文件

打开app.js

<span style="font-size:14px;">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 app = express(); // view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs'); // 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('/', routes);
app.use('/users', users); // catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
}); // error handlers // development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
} // production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
}); module.exports = app;
</span>

这里我们通过require()载入了express、path 等模块,以及 routes 目录下的index. js和 users.js 路由文件。 以下来解说每行代码的含义。

(1) var app = express():生成一个express实例 app。

(2)app.set('views', path.join(__dirname, 'views’)):设置 views 文件夹为存放视图文件的文件夹, 即存放模板文件的地方,__dirname 为全局变量,存储当前正在运行的脚本所在的文件夹。

(3)app.set('view engine', 'ejs’):设置视图模板引擎为 ejs。

(4)app.use(favicon(__dirname + '/public/favicon.ico’)):设置/public/favicon.ico为favicon图标。

(5)app.use(logger('dev’)):载入日志中间件。

(6)app.use(bodyParser.json()):载入解析json的中间件。

(7)app.use(bodyParser.urlencoded({ extended: false })):载入解析urlencoded请求体的中间件。

(8)app.use(cookieParser()):载入解析cookie的中间件。

(9)app.use(express.static(path.join(__dirname, 'public'))):设置public文件夹为存放静态文件的文件夹。

(10)app.use('/', routes);和app.use('/users', users):路由控制器。

(11)

app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});

捕获404错误,并转发到错误处理器。

(12)

if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}

开发环境下的错误处理器,将错误信息渲染error模版并显示到浏览器中。

(13)

app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});

生产环境下的错误处理器。将错误信息渲染error模版并显示到浏览器中。

(14)module.exports = app :导出app实例供其它模块调用。

接下来再看看bin/www文件

#!/usr/bin/env node

/**
* Module dependencies.
*/ var app = require('../app');
var debug = require('debug')('aTest:server');
var http = require('http'); /**
* Get port from environment and store in Express.
*/ var port = normalizePort(process.env.PORT || '3000');
app.set('port', port); /**
* Create HTTP server.
*/ var server = http.createServer(app); /**
* Listen on provided port, on all network interfaces.
*/ server.listen(port);
server.on('error', onError);
server.on('listening', onListening); /**
* Normalize a port into a number, string, or false.
*/ function normalizePort(val) {
var port = parseInt(val, 10); if (isNaN(port)) {
// named pipe
return val;
} if (port >= 0) {
// port number
return port;
} return false;
} /**
* Event listener for HTTP server "error" event.
*/ function onError(error) {
if (error.syscall !== 'listen') {
throw error;
} var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port; // handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
} /**
* Event listener for HTTP server "listening" event.
*/ function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}

解释一下:

(1)#!/usr/bin/env node:表明是 node 可运行文件。

(2)var debug = require('debug')('blog’):引入debug模块。打印调试日志。

(3)var app = require('../app’):引入我们上面导出的app实例。

(4)app.set('port', process.env.PORT || 3000):设置端口号。

(5)

var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});

启动project并监听3000端口,成功后打印 Express server listening on port 3000。

以下再看一下 routes/index.js 文件:

var express = require('express');
var router = express.Router(); /* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
}); module.exports = router;

生成一个路由实例用来捕获訪问主页的GET请求,导出这个路由并在app.js中通过app.use('/', routes); 载入。

这样,当訪问主页时,就会调用res.render('index', { title: 'Express' });渲染views/index.ejs模版并显示到浏览器中。

再看 views/index.ejs 文件:

<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
</body>
</html>

在渲染模板时我们传入了一个变量 title 值为 express 字符串。模板引擎会将全部 <%= title %> 替换为 express 。然后将渲染后生成的html显示到浏览器中,如上图所看到的。

通过上面的知识。我们学习了怎样创建一个project并启动它。了解了project的大体结构和运作流程。下一篇讲路由。

。。



nodejs入门篇---创建project并具体解释的更多相关文章

  1. nodeJs入门篇之认识nodejs

    摘要:将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开 ...

  2. NodeJS入门篇

    在我印象里,“全栈工程师”这个词是NodeJS诞生后才逐渐火起来的,因为NodeJS赋予了JS服务器开发的能力.下面开始从一个小白的角度进军NodeJS... 前言:在学习NodeJS之前是需要安装的 ...

  3. nodejs入门篇之linux版的nodejs简易环境安装部署

    第一步:下载二进制安装包 根据linux的不同版本选择32位或64位,因为我的linux的虚拟机是64位的,所以我选择的是64位二进制安装文件(Linux Binariesx64),可以右键选择在新窗 ...

  4. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...

  5. 【SSRS】入门篇(一) -- 创建SSRS项目

    原文:[SSRS]入门篇(一) -- 创建SSRS项目 在本篇中,您将学习如何在 SQL Server Data Tools (SSDT) 中创建报表服务器项目. 报表服务器项目用于创建在报表服务器中 ...

  6. Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain

    近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...

  7. Sandcastle入门:创建C#帮助文档

    Sandcastle入门:创建C#帮助文档 今天学到了一个东西:利用vs2005生成的dll/xml来生成帮助文档. 完成这个伟大任务的是Sandcastle,微软推出的类库文档编译工具. 在开始这篇 ...

  8. Apache Maven 入门篇 ( 上 )

    作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...

  9. 开心菜鸟系列----函数作用域(javascript入门篇)

      1 <!DOCTYPE html>   2 <html>   3 <script src="./jquery-1.7.2.js"></ ...

随机推荐

  1. 前m大的数

    前m大的数 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java class ...

  2. [USACO 2016 Dec Gold] Tutorial

    Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...

  3. BZOJ 2631 tree(动态树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2631 [题目大意] 要求支持链修改,链查询,边断开,连接操作 [题解] 链修改分乘和加 ...

  4. 【动态规划】CDOJ1271 Search gold

    方格取数. 但由于题意说金币数<0就死了,就不能继续转移. #include<cstdio> #include<algorithm> #include<cstrin ...

  5. [NOIp2017提高组]逛公园

    题目大意: 给你一个有向图,若用dis(u,v)表示从u到v的最短路长度,求从1到n的长度不超过dis(1,n)+k的路径数. 思路: 首先分别预处理出以1,n为起点的单.源最短路. 对于合法的边重构 ...

  6. JavaScript之引用类型(Object类型)

    ECMAScript提供了很多原生的引用类型,以便开发人员进行常见的计算任务. 对象是某一个特定引用类型的的实例. Object类型 用的最多.虽然这个Object实例不具备多少功能,但是在应用程序的 ...

  7. [转]servlet配置中init-param

    需要初始化的参数比如你的servlet里面有个属性为int total=0默认是0,你想让他初始时50则用init-param 给他赋值 init-param面对应的参数名和值,是给servlet在初 ...

  8. MongoDB 刷新几次就报错

    官方: MongoDB.Driver 在页面上 速度刷新几次,就会抛错? 为何? Service 层  Autofac

  9. rman catalog配置简要笔记

    服务端配置: SQL> create tablespace tbs_rman datafile 'H:\oradata\test\tbs_rman.dbf' size 20m autoexten ...

  10. VB里的TEXT控件只能输入数字的代码

    " '先声明一个常量,并把你想禁用或允许输入的内容赋值给它 Private Sub Text1_KeyPress(KeyAscii As Integer) '只能输入数字 KeyAscii ...