美文网首页
从零开始学习nodejs

从零开始学习nodejs

作者: 心淡然如水 | 来源:发表于2019-10-08 08:29 被阅读0次

官网下载node安装包全局安装

我的系统环境

Mac 0.11.6

Nodejs:v6.7.0n

Npm:3.10.7

1.首先,我们需要安装express库。在Express3.6.x之前的版本,Express需要全局安装的,项目构建器模块是合并在Express项目中的,后来这个构建器被拆分出来,独立成为了一个项目express-generator,现在我们只需要全局安装express-generator项目就行了。

终端执行:

npm install -g express-generator@4  #全局安装-g

express -e nodejs-demo  # 创建项目

cd nodejs-demo && npm install

npm start

2. 目录结构

接下来,我们详细看一下Express4项目的结构、配置和使用。

bin, 存放启动项目的脚本文件

node_modules, 存放所有的项目依赖库。

public,静态文件(css,js,img)

routes,路由文件(MVC中的C,controller)

views,页面文件(Ejs模板)

package.json,项目依赖配置及开发者信息

app.js,应用核心配置文件

3. package.json项目配置

package.json用于项目依赖配置及开发者信息,scripts属性是用于定义操作命令的,可以非常方便的增加启动命令,比如默认的start,用npm start代表执行node ./bin/www命令。

查看package.json文件。

{

"name": "express4-demo",

"version": "0.0.0",

"private": true,

"scripts": {

       "start": "node ./bin/www"

},

"dependencies": {

     "body-parser": "~1.10.2",

     "cookie-parser": "~1.3.3",

      "debug": "~2.1.1",

      "ejs": "~2.2.3",

      "express": "~4.11.1",

        "morgan": "~1.5.1",

       "serve-favicon": "~2.2.0"

     }

}

4. app.js核心文件

// 加载依赖库,原来这个类库都封装在connect中,现在需地注单独加载

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();

// 定义EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎

app.set('views', path.join(__dirname, 'views'));

app.set('view engine', 'ejs');

// 定义icon图标

app.use(favicon(__dirname + '/public/favicon.ico'));

// 定义日志和输出级别

app.use(logger('dev'));

// 定义数据解析器

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({ extended: false }));

// 定义cookie解析器

app.use(cookieParser());

// 定义静态文件目录

app.use(express.static(path.join(__dirname, 'public')));

// 匹配路径和路由

app.use('/', routes);

//app.use('/users', users);

// 404错误处理

app.use(function(req, res, next) {

var err = new Error('Not Found');

err.status = 404;

next(err);

});

// 开发环境,500错误处理和错误堆栈跟踪

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

});

});

}

// 生产环境,500错误处理

app.use(function(err, req, res, next) {

res.status(err.status || 500);

res.render('error', {

message: err.message,

error: {}

});

});

// 输出模型app

module.exports = app;

我们看到在app.js中,原来调用connect库的部分都被其他的库所代替,serve-favicon、morgan、cookie-parser、body-parser,默认项目中,只用到了最基本的几个库,还没有其他需要替换的库,在本文最后有详细列出。

另外,原来用于项目启动代码也被移到./bin/www的文件,www文件也是一个node的脚本,用于分离配置和启动程序。

查看./bin/www文件。

#!/usr/bin/env node

/**

* 依赖加载

*/

var app = require('../app');

var debug = require('debug')('nodejs-demo:server');

var http = require('http');

/**

* 定义启动端口

*/

var port = normalizePort(process.env.PORT || '3000');

app.set('port', port);

/**

* 创建HTTP服务器实例

*/

var server = http.createServer(app);

/**

* 启动网络服务监听端口

*/

server.listen(port);

server.on('error', onError);

server.on('listening', onListening);

/**

* 端口标准化函数

*/

function normalizePort(val) {

var port = parseInt(val, 10);

if (isNaN(port)) {

return val;

}

if (port >= 0) {

return port;

}

return false;

}

/**

* HTTP异常事件处理函数

*/

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;

}

}

/**

* 事件绑定函数

*/

function onListening() {

var addr = server.address();

var bind = typeof addr === 'string'

? 'pipe ' + addr

: 'port ' + addr.port;

debug('Listening on ' + bind);

}

相关文章

网友评论

      本文标题:从零开始学习nodejs

      本文链接:https://www.haomeiwen.com/subject/uxeauttx.html