0

0

nodejs教程之环境安装及运行_node.js

php中文网

php中文网

发布时间:2016-05-16 16:30:45

|

1924人浏览过

|

来源于php中文网

原创

nodejs跑起来

第一步当然是安装nodeJS环境了,现在windows安装nodeJS比较快了,直接下载即可:

http://www.nodejs.org/download/

这里根据需要下载,下载完成后直接下一步下一步即可,完了我们就具有nodeJS环境了

第二步,为了方便我们后面操作,我们直接在D盘见了一个文件夹blog

然后打开windows命令行工具,进入d盘,输入:

免费红色响应式多语言企业通用模板1.0.0
免费红色响应式多语言企业通用模板1.0.0

该模板源码有公司简介、公司新闻、产品展示、客户案例、留言等企业官网常用页面功能。模板是响应式模板,支持多语言,完善的标签调用修改起来很方便。功能特点:1. 使用的框架采用HkCms开源内容管理系统v2.2.3版本、免费可以商用。2. 所需环境Apache/Nginx,PHP7.2 及以上 + MySQL 5.6 及以上。3. 安装教程: (1) 站点运行路径填写到public目录下。 (2) 浏览

下载
复制代码 代码如下:
express -e blog

然后里面可能有依赖包,我们需要进入blog目录安装(安装的配置由package.json提供):

复制代码 代码如下:
npm install

这个样子,我们依赖包就下载下来了,其中依赖包与java的包文件,.net的bll文件应该是一个概念

这个时候,我们的程序已经可以运行了:

复制代码 代码如下:
node app

复制代码 代码如下:
D:log>node appExpress server listening on port 3000

这个时候打开浏览器就有反应了:

这里我们使用的是express(一个流行的nodeJSweb开发框架),并且使用了ejs模板引擎

文件结构

初始化文件目录结构如下:

app.js 为入口文件

package.json 为模块依赖文件,我们使用npm install时候他会以其配置在网上下载相关包

node_modules 为下载下来的模块文件(package.json)

public 存放静态资源文件

routes 存放路由文件

views 存放相关视图模板文件

这个样子,我们基本目录结构就出来了,我们这里先简单说下node_modules这个目录

node_modules/ejs

我们刚刚说了,这里面存放着下载下来的模块,说白了就是js文件集合

复制代码 代码如下:

var parse = exports.parse = function(str, options){
  var options = options || {}
    , open = options.open || exports.open || '     , close = options.close || exports.close || '%>'
    , filename = options.filename
    , compileDebug = options.compileDebug !== false
    , buf = "";

  buf += 'var buf = [];';
  if (false !== options._with) buf += ' with (locals || {}) { (function(){ ';
  buf += ' buf.push('';

  var lineno = 1;

  var consumeEOL = false;
  for (var i = 0, len = str.length; i     var stri = str[i];
    if (str.slice(i, open.length + i) == open) {
      i += open.length
 
      var prefix, postfix, line = (compileDebug ? '__stack.lineno=' : '') + lineno;
      switch (str[i]) {
        case '=':
          prefix = "', escape((" + line + ', ';
          postfix = ")), '";
          ++i;
          break;
        case '-':
          prefix = "', (" + line + ', ';
          postfix = "), '";
          ++i;
          break;
        default:
          prefix = "');" + line + ';';
          postfix = "; buf.push('";
      }

      var end = str.indexOf(close, i)
        , js = str.substring(i, end)
        , start = i
        , include = null
        , n = 0;

      if ('-' == js[js.length-1]){
        js = js.substring(0, js.length - 2);
        consumeEOL = true;
      }

      if (0 == js.trim().indexOf('include')) {
        var name = js.trim().slice(7).trim();
        if (!filename) throw new Error('filename option is required for includes');
        var path = resolveInclude(name, filename);
        include = read(path, 'utf8');
        include = exports.parse(include, { filename: path, _with: false, open: open, close: close, compileDebug: compileDebug });
        buf += "' + (function(){" + include + "})() + '";
        js = '';
      }

      while (~(n = js.indexOf(" ", n))) n++, lineno++;
      if (js.substr(0, 1) == ':') js = filtered(js);
      if (js) {
        if (js.lastIndexOf('//') > js.lastIndexOf(' ')) js += ' ';
        buf += prefix;
        buf += js;
        buf += postfix;
      }
      i += end - start + close.length - 1;

    } else if (stri == "\") {
      buf += "\\";
    } else if (stri == "'") {
      buf += "\'";
    } else if (stri == " ") {
      // ignore
    } else if (stri == " ") {
      if (consumeEOL) {
        consumeEOL = false;
      } else {
        buf += "\n";
        lineno++;
      }
    } else {
      buf += stri;
    }
  }

  if (false !== options._with) buf += "'); })(); } return buf.join('');";
  else buf += "'); return buf.join('');";
  return buf;
};

就如,我们这里使用到的ejs模板以及express模块,然后我们好奇的走进了ejs的程序看看究竟有何不同

打开,ejs.js后,我们抽一点代码出来看:这段代码我们比较熟悉,他与underscore的模板引擎代码思想一致,都是将模板解析为字符串

然后通过eval或者new Function的方法将之转换为函数,并且传入自己的数据对象好解析

至于具体工作流程,现在我们还不知道,只能放到后面点研究了,好了我们现在进入其他模块

app.js

作为入口文件,app.js扮演着举足轻重的角色:

复制代码 代码如下:

/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

我们通过require()命令加载express、http模块,并且会加载routes目录下index user等模板文件

app.set('port', process.env.PORT || 3000)为设置启动时候的端口

app.set('views', __dirname + '/views')为设置存放模板文件的路径,其中__dirname为全局变量,存放当前脚本所在目录,我们这样可以查看:

复制代码 代码如下:

console.log(__dirname);//index.js加入以下代码
/**
D:log>node app
Express server li
D:log outes
*/

至于这个__dirname是如何获得的,我们暂时也不需要关注

app.set('view engine', 'ejs') 为设置模板引擎为ejs

app.use(express.favicon())是设置图标想修改的话就自己去搞public下面的images文件

app.use(express.logger('dev')); express依赖于connect这里就内建中间件会输出一些日志

app.use(express.json()); 用以解析请求体,这里就会把字符串动态转换为json对象

app.use(express.methodOverride()); connect内建中间件,用以处理post请求,并可以伪装put等http方法

app.use(app.router); 调用路由器解析规则

app.use(express.static(path.join(__dirname, 'public'))); connect内建中间件,设置根目录下的public存放静态文件

复制代码 代码如下:

if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

这句话意思是开发状况下要输出错误信息

复制代码 代码如下:

app.get('/', routes.index);
app.get('/users', user.list);

这两句都是访问时刻具体的处理文件了,比如这里直接访问时默认访问的是routes.index

然后其内部才真正解析模板数据:

复制代码 代码如下:

exports.index = function (req, res) {
  console.log(__dirname);
  res.render('index', { title: 'Express' });
};

最后会调用上述代码创建http服务器并监听3000端口,成功后便可在网页上访问了

路由

前面我们使用这个方法构建路由

复制代码 代码如下:
app.get('/', routes.index);

上面代码可以使用这个代码取代(写在app里面)

复制代码 代码如下:

app.get('/', function (req, res) {
  res.render('index', { title: 'Express' });
});

这段代码的意思是访问主页时,调用ejs模板引擎,来渲染index.ejs模板文件

现在再做一点修改,以上代码实现了路由功能,但是我们不能将路由相关代码放到app中,路由多了后app就会变得臃肿,所以我们将相关配置放入index中

所以删除app中相关路由功能,在app结尾加入代码:

复制代码 代码如下:
routes(app);

然后修改index.js

复制代码 代码如下:

module.exports = function(app) {
  app.get('/', function (req, res) {
    res.render('index', { title: 'Express' });
  });
};

这个代码是怎么组织的现在还不清楚,也不去关注了,我们后面慢慢看

路由规则

express封装了多种http请求,我们一般使用get/post两种

复制代码 代码如下:

app.get();
app.post();

第一个参数为请求路径,第二个参数为回调函数,还是两个参数为request与response

然后,对于req(request)又有以下规则

req.query 处理get请求,获取get请求参数

req.params 处理/:xxx形式的get或者post请求

req.body 处理post请求,获取post请求体

req.params 处理get和post请求,但查找优先级为req.params->req.body->req.query

路径规则还支持正则,具体我们以后再说......

添加路由规则

当我们访问不存在的链接时:

因为不存在/y的路由规则,他也不说public下的文件,所以就404了

现在我们在index.js中添加相关路由:

复制代码 代码如下:

module.exports = function (app) {
  app.get('/', function (req, res) {
    res.render('index', { title: 'Express' });
  });
  app.get('/y', function (req, res) {
    res.send('叶小钗');
  });
};

这里我页面乱码了:

原因是下载下来后,我的文件是gbk的编码,我们要将他改成utf-8就可以了,模板引擎这块我们就不管他了,我们进入下一节

注册功能

这里我们跟着原博主一起做一个注册的简单功能,这里使用mongo db作为数据库,后面我们再依次完善功能

新建一个register路由,并且为其新建register模板,于是我们开始吧

① 在index中新建路由

复制代码 代码如下:

app.get('/register', function (req, res) {
  res.render('index', { title: '注册页面' });
});

复制代码 代码如下:

module.exports = function (app) {
  app.get('/', function (req, res) {
    res.render('index', { title: 'Express' });
  });

  app.get('/y', function (req, res) {
    res.send('叶小钗');
  });

  app.get('/register', function (req, res) {
    res.render('register', { title: '注册页面' });

  });


复制代码 代码如下:



 
   
   
 
 
   


   

       
用户名:

       
密码:

       

   

 

这个样子,我们页面就形成了:

基本程序有了,我们现在需要数据库支持,于是我们要安装mongoDB环境

MongoDB

MongoDB是一个基于分布式文件存储的NoSQL的一种,由C++编写,MongoDB支持的数据结构松散,类似json,我们知道json可以支持任何类型,所以可以搞出很复杂的结构

复制代码 代码如下:

{
  id: 1,
  name: '叶小钗',
  frinds: [
  { id: 2, name: '素还真' },
  { id: 3, name: '一页书' }
  ]
}

安装MongoDB

首先去http://www.mongodb.org/downloads下载安装文件,然后将文件拷贝到D盘改名mongodb,然后在里面新建blog文件夹

然后打开命令行工具将目录切换至bin,输入:

复制代码 代码如下:
mongod -dbpath d:mongodblog

设置blog文件夹为工程目录并启动数据库,为了方便以后我们写一个命令以后直接点击就启动数据库了:

复制代码 代码如下:
d:mongodbinmongod.exe -dbpath d:mongodblog

链接MongoDB

数据库安装成功后,我们的程序还需要相关的“驱动”程序才能链接数据库,这个时候当然要下载包......

打开package.json在dependencies新加一行

复制代码 代码如下:

{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "3.4.8",
    "ejs": "*",
    "mongodb": "*"
  }
}

然后运行npm install下载新的依赖包,这个样子与mongoDB相关的驱动就有了,要链接mysql等数据库还需要其他依赖包

这时在根目录下创建setting.js文件,保存数据库连接信息

复制代码 代码如下:

module.exports = {
  cookieSecret: 'myblog',
  db: 'blog',
  host: 'localhost'
};

db是数据库名称,host是数据库地址,cookieSecret用于cookie加密与数据库无关

接下来根目录下新建models文件夹,并在models文件夹下新建db.js

复制代码 代码如下:

var settings = require('../settings'),
    Db = require('mongodb').Db,
    Connection = require('mongodb').Connection,
    Server = require('mongodb').Server;
module.exports = new Db(settings.db, new Server(settings.host, Connection.DEFAULT_PORT), {safe: true});

复制代码 代码如下:
new Db(settings.db, new Server(settings.host, Connection.DEFAULT_PORT), { safe: true });

设置数据库名,数据库地址和数据库端口创建一个数据库实例,并通过module.exports导出实例,这样就可以通过require对数据库进行读写

需要成功写入数据库,服务器端程序就需要处理post信息,于是我们在models文件夹下新建user.js

复制代码 代码如下:

var mongodb = require('./db');

function User(user) {
  this.name = user.name;
  this.password = user.password;
};

module.exports = User;

//存储用户信息
User.prototype.save = function (callback) {
  //要存入数据库的用户文档
  var user = {
    name: this.name,
    password: this.password
  };
  //打开数据库
  mongodb.open(function (err, db) {
    if (err) {
      return callback(err); //错误,返回 err 信息
    }
    //读取 users 集合
    db.collection('users', function (err, collection) {
      if (err) {
        mongodb.close();
        return callback(err); //错误,返回 err 信息
      }
      //将用户数据插入 users 集合
      collection.insert(user, {
        safe: true
      }, function (err, user) {
        mongodb.close();
        if (err) {
          return callback(err); //错误,返回 err 信息
        }
        callback(null, user[0]); //成功!err 为 null,并返回存储后的用户文档
      });
    });
  });
};

复制代码 代码如下:

//读取用户信息
User.get = function(name, callback) {
  //打开数据库
  mongodb.open(function (err, db) {
    if (err) {
      return callback(err);//错误,返回 err 信息
    }
    //读取 users 集合
    db.collection('users', function (err, collection) {
      if (err) {
        mongodb.close();
        return callback(err);//错误,返回 err 信息
      }
      //查找用户名(name键)值为 name 一个文档
      collection.findOne({
        name: name
      }, function (err, user) {
        mongodb.close();
        if (err) {
          return callback(err);//失败!返回 err 信息
        }
        callback(null, user);//成功!返回查询的用户信息
      });
    });
  });
};

这里一个写数据,一个读数据,处理程序有了,现在需要在index.js前面加上如下程序

复制代码 代码如下:
var User = require('../models/user.js');

再修改其中的app.post('/register')

复制代码 代码如下:

app.post('/register', function (req, res) {
  var name = req.body.name;
  var pwd = req.body.password;
  var newUser = new User({
    name: name,
    password: pwd
  });
  newUser.save(function (err, user) {
    //相关操作,写入session
    res.send(user);
  });
});

然后点击注册后便会有反应了

如果此时不能确定是否写入数据库,便可进入数据库查询一番,首先切换至数据库目录

复制代码 代码如下:
D:mongodbin>

输入:

复制代码 代码如下:
mongo

然后切换其数据库连接至blog

复制代码 代码如下:
use blog

最后输入

复制代码 代码如下:
db.users.find()

我们大家就开心的看到数据写入了,于是今天的学习暂时告一段落

结语

今天我们跟着一篇博客完成了从安装到写入数据库的操作,明天让我们来将其它方面加入,逐步深化nodeJS的学习

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

28

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

23

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

27

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

16

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

18

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

2

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

164

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

8

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

309

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
快速入门Node.JS全套完整版
快速入门Node.JS全套完整版

共83课时 | 9万人学习

nodejs开发基础教程
nodejs开发基础教程

共15课时 | 4.6万人学习

JavaScript设计模式视频教程
JavaScript设计模式视频教程

共28课时 | 5.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号