精华内容
下载资源
问答
  • Node实战—幼教平台

    2020-04-17 09:25:52
    项目初始化 初始化项目结构 配置babel 新建main.js babel高阶语法转化演示 配置项目依赖 新建public,views文件夹, 引入静态资源 集成静态资源文件 配置全局路径 配置新的模板引擎 配置全局路由 ...
  • Node实战——幼教平台

    2020-12-03 20:58:07
    实现幼教平台的幼教资源部分,实现了文章的展示修改,用户的权限控制等。主要熟悉Node中前后端交互以及和数据库进行交互
  • node开发实战

    2018-01-24 14:25:28
    node实战开发,知识点全面,从环境搭建到实战演练,教你全面运用node.js
  • 在使用 Node.js 编写一个完整的项目时,程序中往往需要用到一些可配置的变量,从而使得程序能在不同的环境中运行,而众所周知,在实际的项目会存在多个不同的环境,不同的环境下,一些配置是不相同的,如何在不同的...
  • 本篇文章主要介绍了借助node实战JSONP跨域实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • node实战书中配套案例

    2014-08-19 14:15:25
    node实战书中配套案例,感觉还不错,可以在本地环境运行调试,帮助更好的掌握node技术
  • Node从入门到实战,,全部视频教程及源码。百度云盘连接
  • 整理的一套常用的三个框架vue核心还有node实战和面试技巧等等学过js的可以看看来,里面有vue,vue实战,bootstrap框架,jQuery EasyUI,angular.js,Ajax,16reactjs拓展,微信小游戏入门与实战 刷爆朋友圈,Vue2.5...
  • 2017免费node.js入门到实战教程.txt 视频教程2017免费node.js入门到实战教程.txt 视频教程2017免费node.js入门到实战教程.txt 视频教程2017免费node.js入门到实战教程.txt 视频教程
  • Node.js 实战 第2版

    千次阅读 2018-11-06 11:55:31
    本书是 Node.js 的实战教程,涵盖了为开发产品级 Node 应用程序所需要的一切特性、技巧以及相关理念。从搭建 Node 开发环境,到一些简单的演示程序,到开发复杂应用程序所必不可少的异步编程。D2 版介绍了全栈开发者...

    内容简介

    本书是 Node.js 的实战教程,涵盖了为开发产品级 Node 应用程序所需要的一切特性、技巧以及相关理念。从搭建 Node 开发环境,到一些简单的演示程序,到开发复杂应用程序所必不可少的异步编程。D2 版介绍了全栈开发者所需的全部技术,包括前端构建系统、选择 Web 框架、在 Node 中与数据库的交互、编写测试和部署 Web 程序,等等。

    • 前端系统构建
    • 服务器端框架选择
    • 如何用 Express 从头开始搭建 Web 程序
    • 与数据库的交互
    • 掌握非阻塞 I/O
    • Node 的事件轮询
    • 测试与部署
    • Web 程序模板
    • 用 Node 开发命令行工具和桌面软件

    作者简介

    亚历克斯 · 杨(Alex Young),经验丰富的 Web 开发者,广受欢迎的 JavaScript 社区 DailyJS 创始人。目前任职于 Apple。另著有《Node.js 硬实战》。

    布拉德利 · 马克(Bradley Meck),TC39 和 Node.js 基金会成员。业余时间醉心于为 JavaScript 制作工具、园艺和指导学生。

    麦克 · 坎特伦(Mike Cantelon),Node.js 核心框架贡献者,Node 社区活跃分子,培训师和演讲人。

    蒂姆 · 奥克斯利(Tim Oxley),JavaScript(Node.js/React)自由撰稿人。

    马克 · 哈特(Marc Harter),Node.js 核心框架贡献者。

    T. J. 霍洛瓦丘(T.J.Holowaychuk),参与开发了很多 Node.js 模块,包括流行的 Express 框架。

    内森 · 拉伊利赫(Nathan Rajlich),大名鼎鼎的 TooTallNate,Node.js 核心代码提交者。

    本书内容

    前言

    《Node.js实战》的第1版出版之后发生了很多事情,io.js 问世,治理模型也发生了翻天覆地的变化。Node 的包管理器孵化出了一家成功的新公司——npm,Babel 和 Electron 等技术也改变了 Node 开发。

    虽然 Node 的核心库变化不大,但 JavaScript 变了,大多数开发人员都用上了 ES2015 的功能特性,所以我们改写了上一版中的所有代码,用上了箭头函数、常量和解构。因为 Node 的库和自带的工具看起来仍然和 4.x 之前的版本差不多,所以我们在这一版的更新中瞄准了社区。

    为了体现 Node 开发人员在实际工作中面临的问题,本书在结构上进行了调整。Express 和 Connect 的分量轻了,涉及的技术范围广了。书中介绍了全栈开发者所需的全部技术,包括前端构建系统、选择 Web 框架、在 Node 中与数据库的交互、编写测试和部署 Web 程序。

    除了 Web 开发,本书还有编写命令行程序和 Electron 桌面程序的章节,让你充分利用自己的 Node 和 JavaScript 技能。

    本书不仅要向你介绍 Node 和它的生态系统,还想尽可能让你了解那些影响 Node 发展的背景知识,比如一般在 Node 和 JavaScript 书籍中并不介绍的 Unix 哲学和如何正确、安全地使用数据库。希望这些知识能拓宽你的眼界,加深你对 Node 和 JavaScript 的理解,帮你在面临新的问题时找到解决办法。

    致谢

    首先要感谢本书上一版的作者们,他们做出了巨大贡献:Mike Cantelon、Marc Harter、T.J. Holowaychuk 和 Nathan Rajlich。还要感谢 Manning 的团队,如果没有他们的鼓励,这一版也不会问世。感谢我的策划编辑 Cynthia Kane,在更新原内容的漫长过程中让我保持专注。如果没有 Doug Warren 详尽的技术校对,本书及其中代码的正确率恐怕连现在的一半都不到。最后要感谢在写作及开发过程中提供反馈的评审人员:Austin King、Carl Hope、Chris Salch、Christopher Reed、Dale Francis、Hafiz Waheedud din、HarinathMallepally、Jeff Smith、Marc-Philippe Huget、Matthew Bertoni、Philippe Charrieère、Randy Kamradt、Sander Rossel、Scott Dierbeck和William Wheeler。

    关于本书

    本书第1版重点介绍了如何用 Web 框架 Connect 和 Express 开发 Web 程序。第2版则根据 Node 开发的变化做了调整。我们会介绍前端构建系统、流行的 Node Web 框架,以及如何用 Express 从头开始搭建 Web 程序,还会讲到自动化测试和 Node Web 程序的部署。

    因为用 Node 做的命令行开发者工具和用 Electron 做的桌面端程序越来越多,所以本书专门用了两章的篇幅分别介绍这两块内容。

    本书假定你熟悉基本的编程概念。但考虑到有些开发人员还没有接触过新的 JavaScript,所以第1章将会介绍 JavaScript 和 ES2015。

    路线图

    本书分为三部分。

    第一部分介绍 Node.js,讲解用它进行开发所需的基础技术。第1章介绍了 JavaScript 和 Node 的特性,通过示例代码一步步进行讲解。第2章介绍了基本的 Node.js 编程概念。第3章完整地演示了如何从头开始搭建一个 Web 程序。

    第二部分重点介绍 Web 开发,内容最多,篇幅也最长。第4章是前端构建系统的揭秘。如果你在项目中用到过 Webpack 或 Gulp,但并没有真正掌握它们,那么可以学习一下这一章的内容。第5章介绍了 Node 中最流行的服务器端框架。第6章详细介绍了 Connect 和 Express。第7章是模板语言,它可以提升服务端代码的编写效率。大多数 Web 程序都需要数据库,所以第8章介绍了很多种可以用在 Node 中的数据库,关系型和 NoSQL 都有涉及。第9章和第10章讲了测试和部署,包括云端部署。

    第三部分是 Web 程序开发之外的内容。第11章讲了如何用 Node 搭建命令行程序,创建出开发人员熟悉的文字界面。如果你喜欢用 Node 搭建像 Atom 一样的桌面程序,可以看看介绍 Electron 的第12章。

    本书还有三个附录。附录 A 讲了如何在 macOS 和 Windows 上安装 Node,附录 B 详细介绍了如何实现网络内容抓取,附录 C 介绍了 Connect 的官方中间件组件。

    编码规范及下载

    书中的代码遵循通用 JavaScript 规范。缩进用空格,不用制表符。尽量不要让一行代码的长度超过80个字符。很多代码清单中都加了注释,指出了其中的关键概念。

    每行一条语句,简单语句后面加分号。代码块放在大括号中,左括号放在代码块开始行的末尾处,右括号的缩进跟代码块开始行的缩进保持一致,在垂直方向上对齐。

    书中示例的源码请至图灵社区本书主页http://www.ituring.com.cn/book/1993随书下载处下载。

    本书论坛

    购买了英文版的读者可以免费访问 Manning 出版社运营的专享论坛,你可以在那里发表对图书的评论,提出技术问题,寻求作者和其他读者的帮助。

    Manning 的初衷是为读者间、读者与作者间提供一个交流场所。作者完全可以根据个人意愿进行参与,在论坛上所做的贡献是没有报酬的。所以我们建议你尽可能提出一些有挑战性的问题,以激发作者的兴趣!只要书还在发行,出版社的网站上就会有关于书的论坛和之前讨论过的内容的归档。

    读者也可登录图灵社区本书主页http://www.ituring.com.cn/book/1993提交反馈意见和勘误。

    第一部分 Node 基础知识介绍

    现如今,Node 已经出落成了一个成熟的 Web 开发平台。本书第1章到第3章介绍 Node 的主要特性,包括如何使用 npm 和 Node 的核心模块。你还将看到如何在 Node 上使用现代版 JavaScript,以及如何从头开始构建一个 Web 应用程序。看完这些章节之后,对于 Node 能做什么,以及该如何创建自己的项目,你将会有非常深刻的认识。

    第1章 欢迎进入 Node.js 的世界
    第2章 Node 编程基础
    第3章 Node Web 程序是什么
    第二部分 Node 的 Web 开发
    第4章 前端构建系统
    第5章 服务器端框架
    第6章 深入了解 Connect 和 Express
    第7章 Web程序的模板
    第8章 存储数据
    第9章 测试 Node 程序
    第10章 Node 程序的部署及运维
    第三部分 超越 Web 开发
    第11章 编写命令行程序
    第12章 用 Electron 征服桌面
    附录A 安装 Node
    附录 B 自动化的网络抓取
    附录 C Connec 的官方中间件

    阅读全文: http://gitbook.cn/gitchat/geekbook/5bbd7dc39ccd7c1379f3060b

    展开全文
  • 最新Node.js视频教程,Node实战项目视频教程,非常不错
  • Node.js 实战

    2017-08-12 10:48:39
    Node.js 实战(双色)》通过8 个实例讲解了Node.js 在实战开发中的应用,涉及Node.js 常用框架、非关系型数据库、关系型数据库、运维命令和网络安全等内容。章节按照从简单到复杂的难度排序,每一章都通过一个有趣...
  • 本课程实现和美团网的核心部分。采用异步的方式,通过AJAX从服务端获取数据,并使用Vue2和jQuery...美团网实现的功能包括首页分类显示、注册登录、商品页面、套餐页面、购物,支付(使用Node.js实现)、个人中心等。
  • node.js实战

    千人学习 2019-03-18 19:42:35
    从0基础开始,根据我个人在工作中积累的经验,依据企业实战所需技术为目标,详细讲解node.js、express、ejb、mysql及其它相关框架,最后会使用一个小型的实战项目来把所有技术串连起来,让学员掌握的node.js服务器...
  • Node.js实战项目(一)----首页渲染

    千次阅读 2018-03-29 11:38:37
    我要用Node来做一个分享读后感的网站,这个Node实战系列就是一个记录。1、项目初始化把写好的前端代码拷进项目文件夹,然后初始化,以及安装各种包,这里我用的是yarn 和npm是一样的yarn init yarn add express这就是...

    我要用Node来做一个分享读后感的网站,这个Node实战系列就是一个记录。

    1、项目初始化

    把写好的前端代码拷进项目文件夹,然后初始化,以及安装各种包,这里我用的是yarn 和npm是一样的

    yarn init
    yarn add express

    这就是初始化好了的项目文件目录结构,入口文件是app.js

    2、优化目录结构

    项目初始化后,项目目录依旧很乱,这不符合我们的要求,所以我们要对项目的目录结构进行优化,

    1、引入express框架。

    2、新建views作为存放前端视图的文件夹。

    3、新建public作为存放静态文件的文件夹。

    var express = require('express');
    var app = express();
    
    //设置视图模板引擎
    app.set('views', './views');
    app.set('view engine','ejs');
    //静态文件存放目录
    app.use('/static',express.static('public'));
    整理后的文件目录结构为

    这样就清爽多了

    3、首页渲染

    这里我选用的是ejs作为前端模板,所以index.html要改为.ejs后缀

    (views文件夹)

    顺便一提,在views中,我把前端页面分为两部分,一是纯粹的展示性的页面放进article文化夹中,另一个是涉及提交数据等的页面,我放进admin文件夹中。

    改好文件后缀之后还需要改的就是代码中所链接文件的目录。

    之前我把所有静态文件都放进了public文件夹中,又在代码中设置了public目录的路径为'/static'

    所以index.ejs里的文件路径也要改了

    <link rel="stylesheet"href="/css/index.css">
    改为
    <link rel="stylesheet"href="static/css/index.css">

    将文件中的链接路径都修改后,在app.js里增加首页渲染的代码

    var express = require('express');
    var app = express();
    
    //设置视图模板引擎
    app.set('views', './views');
    app.set('view engine','ejs');
    //静态文件存放
    app.use('/static',express.static('public'));
    
    //'/'表根目录
    app.get('/', function (req, res,next) {
        res.render('index');
    });
    
    app.listen(3000);

    在命令窗启动app,'''node app.js',打开浏览器输入127.0.0.1:3000我们就能看到首页被成功渲染出来了






    展开全文
  • Node.js 硬实战:115 个核心技巧》是一本面向实战Node.js 开发进阶指南。作为资深专家,《Node.js 硬实战:115 个核心技巧》作者独辟蹊径,将着眼点放在Node.js 的核心模块和网络应用,通过精心组织的丰富实例,...
  • 基于 Node.js Koa2 实战开发的一套完整的博客项目网站,使用 Koa2 二次开发一套适合多端的 RESTful API,同时配套完整的后台管理系统,且前端展示既有基于 ejs 服务端渲染,也有基于 Vue.js 前后端分离的 2 套前端...
  • Node.js开发实战详解完整版pdf
  • Node.js 实战开发:博客系统

    千次阅读 2019-01-22 18:06:09
    三、开发实战 1、构建项目目录结构、安装各种所需要的模块框架等等 npm init npm install --save XXX 2、目录结构 3、创建应用,监听端口 //app.js var express = require("express"); var app = express(); ...

    一、需求分析
    Node.js 实战开发:博客系统
    Node.js 实战开发:博客系统
    Node.js 实战开发:博客系统
    Node.js 实战开发:博客系统
    二、开发工具
    1、NodeJs:基础核心开发语言
    2、express:一个简洁而灵活的nodejs web应用框架,提供一系列强大的特效帮助我们创建各种web应用
    从本质上来说,一个 express 应用就是在调用各种中间件。
    3、mongodb:数据库
    4、第三方模块/中间件
    bodyParser:解析post请求数据
    cookies:读/写cookie
    swig:模板解析引擎
    mongoose:操作mongodb数据
    markdown:markdown语法解析生成模块

    require一个模块,如果是通过npm安装的或者是express内置的模块,直接require(‘模块名’)
    如果是自定义的模块,必须加上相对路径

    三、开发实战
    1、构建项目目录结构、安装各种所需要的模块框架等等
    npm init
    npm install --save XXX
    2、目录结构
    Node.js 实战开发:博客系统

    3、创建应用,监听端口

    //app.js
    var express = require("express");
    var app = express();
    var server = app.listen(8888, function(){
        console.log("Server is running on http://localhost:8888");
    });

    4、用户访问流程
    用户通过URL访问web应用,如:http://localhost:8888
    web后端根据用户访问的URL处理不同的业务逻辑
    5、路由绑定
    通过app.get()或ap.post()等方法可以把一个url路径和一个/N个函数进行绑定

    app.get( ‘/’,function(req,res,next){
        //req:request对象,保存客户端发送请求的一些数据  === http.request
        //res:response对象,服务端输出对象,提供了一些服务器端输出的相关方法  === http.response
        res下面有write、end、statusCode、setHeader、writeHead等属性和方法
        //next:方法,用于执行下一个和路径匹配的函数
    } )

    6.1、直接内容输出
    通过res.send(string)发送内容至客户端
    6.2、通过模板渲染内容
    res.render():将会根据views中的模板文件进行渲染
    如果不想使用views文件夹,想自己设置文件夹名字,那么app.set("views","aaaa");
    注:如果想写一个快速测试页,当然可以使用res.send(),send这个函数将根据内容,自动帮我们设置了Content-Type头部和200状态码。send()只能用一次,和end一样。和end不一样在哪里?能够自动设置MIME类型。
    7、模板的使用
    后端逻辑和页面表现分离-即前后端分离
    8、模板的配置

    var swig = require('swig');
    app.engine('html',swig.renderFile);
    //定义当前应用所使用的模板引擎,使用swig.renderFile方法解析为后缀为html的文件
    app.set('views','./views');
    //设置模板存放目录
    app.set('view engine','html');
    //注册模板引擎
    swig.setDefault({cache:false});

    9、设置静态文件托管目录
    css、img、js等都通过下面的方法进行托管
    app.use('/public',express.static(dirname+'/public'));
    在public目录下划分并且存放好相关的静态资源文件
    意思是:当用户访问的url以/public开始,那么直接返回对应
    dirname+'/public'下的文件

    10、前后端工作流程:
    用户发送http请求 -> 这个请求是一个url -> 后端解析url,提取信息 -> 找到匹配的规则 -> 满足规则以后,执行绑定函数,返回对应内容给用户

    划分:静态文件、动态文件处理两部分
    静态文件:
    访问/public下的文件 -> 静态文件 -> 直接读取指定目录下的文件,直接渲染,返回给用户
    动态文件:
    处理业务逻辑,加载模板,解析模板 -> 返回数据给用户
    通过路由匹配来获取指定文件内容

    11、模块划分
    根据功能进行模块划分
    前台模块 main.js
    后台管理模块 admin.js
    API模块(页面使用ajax请求的模块)api.js
    app.js:整个应用的入口文件

    //使用app.use()进行模块划分
    app.use('/admin',require('./router/admin'));  //请求admin.js,当url匹配都/admin,就会请求./router/admin这个下面的admin.js文件,下面类似
    app.use('/api',require('./router/api'));  //请求api.js
    app.use('/',require('./router/main'));  //请求main.js
    
    admin.js
    let express = require('express');
    let router = express.Router();
    router.get('/',(req,res,next)=>{
        res.send('admin');
    })
    module.exports = router;

    12、数据库连接、表结构Schema定义、Model创建
    Node.js 实战开发:博客系统

    进入到mongoDB安装目录下的bin目录,执行命令:
    mongod --dbpath=D:\妙味课堂文件夹\190122Nodejs开发博客系统\db --port=27017
    定义数据库存放位置和端口号
    然后连接数据库,这里通过可视化界面工具来连接数据库:Robomongo软件来连接

    13、连接数据库成功之后,在schemas文件夹下,新建用户表结构,user.js,定义用户的表
    但是这里不是直接操作这个表结构的,而是通过model模型类来对表进行增删改查,
    model模型类:可以理解成对数据操作的封装,Model中封装对数据进行处理的逻辑业务。

    14、ajax发送请求的url地址:url : '/api/user/register',发送信息到后台,后台进行接收前台传过来的数据

    ‘api/user/register’ 是解析router配置的第一级路径'/api'的,然后在二级router下再匹配对应的 ‘user/register’

    对应api.js文件下的 '/user/register' 路由
    这里使用post请求,接收前端传递过来的数据,使用body-parser中间件
    使用:

    //在入口文件app.js里面:
    //加载body-parser,用来处理post提交过来的数据
    var bodyParser = require('body-parser');
    //bodyparser设置
    app.use( bodyParser.urlencoded({extended: true}) );
    这样在模型类api.js里面,通过req.body就可以获取到前端传递过来的值
    router.post('/user/register',(req,res,next)=>{
        console.log(req.body);  //{ username: 'xiaoxiao', password: '11', repassword: '11' }
            res.json(responseData); //将responseData对象转为json格式,返回给前端
    })
    就可以获取到post提交过来的数据,
    反正前端通过post提交表单数据,那么后端就可以通过req.body来获取到该数据
    数据的key值是input表单的name值,value值是用户输入的值
    
    //查询数据库中相同用户名和密码的记录是否存在,如果存在则登录成功
    

    15、获取到了前台传递过来的数据之后,后台再进入数据库进行操作,分2种情况:
    注册:此时,数据库如果有该信用户名,说明数据库已经存在,则返回信息给前端,提示用户名已经存在
    数据库如果没有注册信息,则需要把注册信息存入数据库,提示前台注册成功
    这里面就涉及到了对数据的查找,可以使用find或者findOne进行查找
    没有数据还要执行存储使用save进行操作

    16、
    Request Headers:是浏览器向服务器发送请求的时候,传递给服务端的数据
    Response Headers:是服务器发传递给客户端的数据

    17、渲染模板的同时带入数据
    res.render('admin/index',{
    userCookie:req.userCookie //userCookie可以直接带入到模板里面,使用{{}}就可以获取到数据
    })

    18、模板的使用
    在index页面引入layout页面:{% extends 'layout.html' %}
    在index页面重写layout页面内容

    layout页面需要被重写的内容使用:{%block main%}{%endblock%}代替
    index页面,使用语法:
    {% block main %}
    //这里面是重写的内容
    {% endblock %}
    即把layout页面需要被重写的内容剪切到index页面,然后各自用语法代替,语法如上所示

    19、各自路径的设置
    ①、html页面里的href路径,需要写全,即哪个路由下面的某某路径,比如
    <a href="/admin/user">用户管理</a>
    如果是三层,比如:<a href="/admin/category/add">添加分类</a>,那么对应的请求接口为:
    router.get('/category/add')
    ②、与此相对应的,是router下面的路由文件,因为路由文件,比如本身已经命名为admin.js,那么下面请求的接口只需要写router.get('/user')即可
    ③、res.render渲染的模板路径,也要写全,是哪个文件夹下的某某文件,比如:
    res.render('admin/category_add'),后缀名可以不用写
    ④<a href="/admin/category_add">添加分类</a>,跳转到添加分类页
    这种写法默认是get请求,所以处理路由就得使用get进行:router.get('/category_add')
    如果要传递数据过去,在表单里面
    <form action="/admin/category_add" method="POST" role="form"></form>
    就使用router.post('/category_add')
    地址都是/category_add,只不过一个是get请求,一个是post请求
    ⑥⑤

    20、a链接点击实现post方式提交,

    <a href="/admin/category_edit?id={{item._id.toString()}}">修改</a>
    //点击页面会跳转到category_edit,匹配了get和post路由
    router.get('/category_add')、router.post('/category_add')
    //此时,form表单可以不需要写action的url地址,因为还是在当前页,当前页的路由还是/category_add,还是会匹配到对应的路由,执行对应的操作

    对应的form表单:

    <form method="POST" role="form">
        <legend>修改分类</legend>
    
        <div class="form-group">
                <label for="">分类名称</label>
                <input type="text" name="categoryName" value="{{categoryName}}" class="form-control" id="" placeholder="修改分类">
        </div>
        <button type="submit" class="btn btn-primary">提交</button>
    </form>

    post表单用于有前台信息(一般是form表单)传递到后台、其他情况可以使用get请求

    错误集结:
    1、throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
    这种错误一般是模块没有导出,使用module.exports = 导出即可
    2、Node.js 实战开发:博客系统
    报错:Cannot set headers after they are sent to the client
    nodejs+express中出现这个错误都在路由里,大部分是程序运行了res.xxx之后,后面还有和请求,响应相关的操作造成的.
    主要是程序运行的先后顺序没理解透,也就是nodejs的一大特性 : 异步.初学者特别要注意.
    -- 理解到了nodejs程序运行的先后顺序,这个问题就迎刃而解.
    -- 还有就是res.xxx操作之后最好不要再有代码,就算是打印输出的代码也写在res.xxx之前,

    -- 另外,nodejs程序就算res.xxx响应以后,程序还会继续执行,return下更好.

    3、Error: Failed to lookup view "index" in views directory "/views"
    view模板文件目录找不到
    views错误与否取决你是怎么运行app.js,我使用cmd到指定目录下运行app.js就不会出现这个问题,而使用webstorm直接运行app.js就会出现这个问题。这个应该是文件目录的问题。想要在两种方式下都可以找到views的方法是使用:

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

    4、报下面的错误
    CastError: Cast to ObjectId failed for value "" at path "_id" for model "Category"
    是因为:submit提交还是在当前页面,路由不变,还是会走router.post('/category_edit'),而form表单加了action="/admin/category_edit",所以估计是重复报错,删掉form表单的action就行了;
    以后注意:如果提交的页面还是在当前页面,那么就不用加action了,当前页面不变,路由自然就会继续执行

    转载于:https://blog.51cto.com/9161018/2345539

    展开全文
  •  $ sudo docker run -d --name "nodeCountAccess" -p 8000:8000 -v /var/node/docker_node:/var/node/docker_node -v /var/log/pm2:/root/.pm2/logs/ --link redis-server:redis -w /var/node/docker_node/ ...

       如何利用Docker快速发布一个Nginx+Express+Redis项目,然后使用Jenkins进行简单的持续集成发布工作。

    1.1 什么是Docker

       Docker在2013年首次进入业界的视线。官网定义:

       “Docker是一个为开发者和运维管理员搭建的开放平台软件,可以在这个平台上创建、管理和运行生产应用。Docker Hub是一个云端服务,可以用它共享应用或自动化工作流。Docker能够从组件快速开发应用,并且可以轻松地创建开发环境、测试环境和生产环境。”

       Docker容器完全使用沙箱机制,独立于硬件、语言、框架、打包系统,相互之间不会有任何接口,几乎没有任何性能开销,便可以很容易地在机器和数据中心中运行。最重要的是,它不依赖于任何语言、框架或系统。

       由于容器体积小,可以快速部署,所以有助于开发者进行超大规模的部署。相对于虚拟机,开发者可以使用更少的存储空间、内存和CPU,因为其在性能方面基本上不需要系统开销。

    1.2 Nginx作为Node.js前端Web Server的作用

        Nginx是轻量级网页服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

        正向代理:比如我们想访问一些国外的网站,可是由于某些原因无法正常打开该网站或者打开缓慢,这时我们通过香港的HTTP代理就可以正常访问一些国外网站了,在此,香港的这个HTTP代理就是正向代理。

        反向代理,正好相反,比如我们有一个对外的API服务api.nodeInAction.com,初期我们启动一台服务器、一个Node.js进程就可以完成负载,但是随着后期访问量的加大,可以在Nginx后端添加多个服务器或启动多个进程来分担访问压力。

        把它放在Node.js的应用,有几个好处:

        1、静态文件性能:Node.js的静态文件处理性能受限于它的单线程异步I/O模型。使用Nginx处理静态文件的性能基本上是纯Node.js的2倍以上。

        2、反向代理规则:使用Nginx的配置文件就可以简单实现session的问题。

        3、扩展性:最典型的就是加入Lua语言的扩展。

        4、稳定性和转发性能:

        5、安全性:

        6、运维管理:

        一个好习惯就是,在生产环境中,永远把Nginx放置在Node.js的前端,对性能、安全性和将来的扩展都有益处。

    1.3 安装Docker和下载Images镜像

       $ sudo docker pull centos:7

    ○ → sudo docker images centos
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              7                   ff426288ea90        2 weeks ago         207MB

    1.4 Docker常用命令

        1、获取镜像: $ sudo docker pull NAME[:TAG]

        2、启动Container盒子: $ sudo docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

          $ sudo docker run -t -i centos /bin/bash

        3、查看镜像列表,列出本地的所有images: $ sudo docker images [OPTIONS] [NAME]

        4、查看容器列表,可看到我们创建过的所有Container

         $ sudo docker ps [OPTIONS]   ==>  sudo docker ps -a

        5、删除镜像,从本地删除一个已经下载的镜像

         $ sudo docker rmi IMAGE [ IMAGE ... ]

        6、移除一个或多个容器实例

         $ sudo docker rm [OPTIONS] CONTAINER [CONTAINER... ]

        7、停止一个正在运行的容器

         $ sudo docker kill [OPTIONS] CONTAINER [CONTAINER...]

         $ sudo docker kill 026e

        8、重启一个正在运行的容器

         $ sudo docker restart [OPTIONS] CONTAINER [CONTAINER ... ]

        9、启动一个已经停止的容器

         $ sudo docker start [OPTIONS] CONTAINER [CONTAINER ... ]

         $ sudo docker start  026e

    1.5 启动Container盒子

          Image和Container的关系,Docker会根据当前的Image创建一个新的Container,Container是一个程序运行的沙箱,它们互相独立,但都运行有Image创建的执行环境之上。

    1.6 文件卷标加载

       把本机的/etc目录挂载到Container里的/opt/etc下面,并且打印Container的/opt/et目录。

       $ sudo docker run --rm=true -i -t --name=ls-volume -v /etc/:/opt/etc/ centos ls /opt/etc

    1.7 将多个Container盒子连接起来

        下载一个Redis数据库的镜像:

        $ sudo docker pull redis:latest

        启动Redis镜像的Container,开启redis-server持久化服务。

        $ sudo docker run --name redis-server -d redis redis-server --appendonly yes

        启动一个Redis镜像的Container作为客户端,连接刚才启动的redis-server

        $ sudo docker run --rm=true -it --link redis-server:redis redis /bin/bash
    root@819902062c6b:/data# env

    root@819902062c6b:/data# redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"  #连接redis
    172.17.0.2:6379> set a 1
    OK
    172.17.0.2:6379> get a
    "1"

    1.8 不要用SSH连接到你的Container盒子

        在Container里安装一个SSH Server是非常诱人的,因为这样我们就可以直接连接到Container,并且进入它的内部,我们可以让本地的SSH客户端连Container。

        但在这么做之前需要考虑以下几个问题:

    • (1)需要SSH,用来检查日志、做备份、重启进程、调整配置或者查看服务器情况。
    • (2)如何管理密钥和密码?需要更新Image或文件卷中的密钥和密码时可能会带来问题。
    • (3)如何管理你的密码升级?一旦密钥或密码泄漏就需要重启Container。这也可能让Memcache这样的内存缓存服务器的缓存全部丢失。
    • (4)是否加入SSH Server就能工作?不是的,还需要加入进程管理软件、Monit或Supervisor等监控软件。如果停止了,你不得不从你的进程管理软件那里获得信息,因为Docker只能管理单进程。

    不使用SSH,我们该如何做以下事情呢?

    (1)备份数据。数据必须是一个volumn,这样可以启动另外一个Container,并且通过--volumes-from来共享应用的Container数据,数据备份就不会影响到我们的应用Container.。

    (2)检查日志。重新启动一个日志分析的Container来处理日志和检查日志。

    (3)重启应用服务。只需重启Container即可。

    (4)修改配置文件。如果需要在应用存活期间改变自己的配置,例如增加一个新的虚拟站点,那么还是需要使用volumn来处理,这样,所有的应用Container都可以快速地临时变更配置。

    (5)调试应用。这可能是唯一需要进入Container的场景了,这样你就需要用到nsenter软件。用来进入现有的命名空间。尽管这个Container没有安装SSH Server或者其他类似软件。

       项目地址:https://github.com/jpetazzo/nsenter

       命令安装nsenter。sudo docker run -v /usr/local/bin:/target jpetazzo/nsenter

       需要进入的Container的pid。获取pid号

       $ sudo docker inspect --format {{.State.Pid}} 258c96d111f3

       15926

       进入Container

       $ sudo nsenter --target 15926 --mount --uts --ipc --net --pid

    1.9 配置DockerImages镜像和发布应用

       开始简单制作一个Node.js包含Express.js环境的镜像,通过pm2来启动Web应用,然后发布到Docker云上;使用Redis数据库来暂存用户的访问次数;Nginx作为反向代理。

       $ sudo docker pull redis

       $ sudo docker pull node

       $ sudo docker images 

       在本地创建一个部署Node.js应用的目录,然后写上package.json

       $ sudo mkdir /var/node/docker_node -p

       制作node镜像,并安装pm2软件(Node.js进程管理软件,可以方便地重启进程和查看Node.js日志)

       $ sudo docker run -i -t node /bin/bash
    $ npm install pm2 -g

    $ pm2 -v
    2.9.3

    #考虑国内的网络,再装下cnmp更靠谱些

    $ npm install cnpm -g --registry=https://registry.npm.taobao.org

    $ exit

        把镜像push到云上,必须以<用户名>/<镜像名>这样的方式提交,比如doublespout/node_pm2

        $ sudo docker login

        $ sudo docker  commit 7a3e doublespout/node_pm2

        # 查看Images列表

        $ sudo docker images <镜像名>

        # 把镜像提交到云上

        $ sudo docker push doublespout/node_pm2

        # 删除本地doublespout/node_pm2,试着从云上下载这个镜像

        $ sudo docker rmi doublespout/node_pm2

        $ sudo docker images doublespout/node_pm2

        $ sudo docker pull doublespout/node_pm2

        通过Redis镜像启动一个Redis的Container

        $ sudo docker run --name redis-server -d redis redis-server --appendonly yes

        准备编写Node.js代码来实现这个计数访问应用的功能。

        /var/node/docker_node/package.json

    {
    	"name" : "docker_node",
    	"version" : "0.0.1",
    	"main" : "app.js",
    	"dependencies" : {
    		"express" : "4.10.2",
    		"redis": "0.12.1"
    	},
    	"engines" : {
    		"node" : ">=0.10.0"
    	}
    }
        /var/node/docker_node/app.js,通过Redis记录访问次数

    var express = require('express');
    var redis = require('redis');
    var app = express();
    // 从环境变量里读取Redis服务器的ip地址
    var redisHost = process.env['REDIS_PORT_6379_TCP_ADDR'];
    var redisPort = process.env['REDIS_PORT_6379_TCP_PORT'];
    var redisClient = redis.createClient(redisPort, redisHost);
    app.get('/', function(req, res) {
    	console.log('get request');
    	redisClient.get('access_count', function(err, countNum) {
    		if (err) {
    			return res.send('get access count error');
    		}
    		if (!countNum) {
    			countNum = 1;
    		} else {
    			countNum = parseInt(countNum) + 1;
    		}
    		redisClient.set('access_count', countNum, function(err) {
    			if (err) {
    				return res.send('set access count error');
    			}
    			res.send(countNum.toString());
    		});
    	});
    });
    app.listen(8000);

        启动一个Container把依赖包装一下

        $ sudo docker run --rm -i -t -v /var/node/docker_node:/var/node/docker_node -w /var/node/docker_node/ doublespout/node_pm2 cnpm install

        -w参数表示命令执行的当前工作目录。

        如果出现EACCESS的权限错误。su -c "setenforce 0"

        启动一个运行这个程序的Container,要求这个Container有端口映射、文件挂载,并同时加载Redis的那个Container,命令如下:

        挂载pm2的日志输出

        $ mkdir /var/log/pm2

        使用pm2启动app应用

        $ sudo docker run -d --name "nodeCountAccess" -p 8000:8000 -v /var/node/docker_node:/var/node/docker_node -v /var/log/pm2:/root/.pm2/logs/ --link redis-server:redis -w /var/node/docker_node/ doublespout/node_pm2 pm2 --no-daemon start app.js

        打开 http://127.0.0.1:8000/

         Nginx反向代理:由于使用Docker的Container,所以它的IP地址是动态变化的,那么配置写起来会比较困难,这里暂不使用Docker容器来管理Nginx,而是直接编译安装Nginx。

         使用Niginx的分支版本openresty来做反向代理,比Nginx内置了ngx-lua模块,让Nginx具有逻辑处理能力。

         $ wget https://openresty.org/download/openresty-1.11.2.2.tar.gz

         $ ./configure --prefix=/opt/openresty --with-pcre-jit --with-ipv6 --without-http_redis2_module --with-http_iconv_module -j2

         $ make && make install

         $ ln -s /opt/openresty/nginx/sbin/nginx  /usr/sbin/

         修改配置文件在/opt/openresty/nginx/conf/nginx.conf,此配置文件是精简版,不要用于生产环境

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        server_names_hash_bucket_size 64;
        access_log off;
    
        sendfile        on;
        keepalive_timeout  65;
    
        server {
            listen       3001;
            server_name  localhost;
    
            location / {
                proxy_pass http://127.0.0.1:8000;
                proxy_redirect default;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $http_connection;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
            }
        }
    }
        $ sudo nginx 启动openrestry

        打开http://127.0.0.1:3001/

        如果遇到在Container里无法解析域名的情况,就需要手动增加DNS服务器:

    DOCKER_OPTS="    --dns 8.8.8.8"
    service docker restart

    1.10 什么是Jenkins

        Jeknins是一款有Java开发的开源软件项目,旨在提供一个开放易用的软件平台,使持续集成变成可能,它的前身是大名鼎鼎的Hundson。是收费的商用版本,Jenkins是它的一个免费开源的分支。    

        持续集成:(IBM团队的定义)“随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题,持续集成正是针对这类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证的,包括自动编译、发布和测试,从而尽快发现集成错误,让团队能够更快地开发内聚的软件。”

         它的核心价值:

    • (1)持续集成中的任何一个环节都是自动完成的,无须太多的人工干预,有利于减少重复过程,以节省时间、费用和工作量。
    • (2)持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。也就是说,在任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为可能。
    • (3)持续集成还有利于软件本身的发展趋势,这点在需求不明确或者频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队开发产品的信心。

       简而言之,利用Jenkins持续集成Node.js项目之后,就不用每次都登录到服务器,执行pm2 restart xxx 等。只需单击“立即构建”按钮,就可以自动从Git仓库获取代码,然后远程部署到目标服务器,执行一些安装依赖包和测试的命令,最后启动应用。

    1.11 通过Docker安装和启动Jenkins

       $ sudo docker pull jenkins

       把Jenkins的文件存储地址挂载到主机上,万一Jenkins的服务器重装或者迁移,我们都可以很方便地把之前的项目配置保留,否则就只能进入Container的文件系统里去复制了。另外,Jenkins会搭建在内网的服务器上,而非生产服务器,如果外网能直接访问,那么可能会造成一定的风险。

       # 创建配置文件目录

       $ sudo mkdir /var/jenkins_home

       $ sudo docker run -d --name myjenkins -p 49001:8080 -v /var/jenkins_home:/var/jenkins_home jenkins

       建议去系统管理--->管理用户栏目中创建几个用户和权限,方便多人协同操作。

    1.12 配置Jenkins并自动化部署Node.js项目

        

    展开全文
  • node.js实战(第2版)PDF【内容可以编辑】& 对应的源码。
  • 一本介绍web开发框架koa的书,Node.js诞生于2009年,到本书出版时已经有近10个年头。它扩充了JavaScript的应用范围,使JavaScript也能像其他语言一样操作各种系统资源,因此,前端工程化开发的大量工具都开始运行在...
  • redux+react+router+node.js

    2018-09-03 15:15:30
    redux+react+router+node.js(redux+react router+node.js全栈开发.doc)
  • Node.js入门
  • 跟着《Node.js开发指南》,跟着跟着跟丢了,我是个小白,学习node差不多两周了,现在在学习express,但是他书上的有些看不懂,也不明白是什么意思,像用express -t ejs microblog建立工程后的app.js怎么来的,工程建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,081
精华内容 23,232
关键字:

node实战