`

node.js学习入门示例

阅读更多
  这些天有点儿空闲,学习了一下node.js。先把《Node.js开发指南》书中的博客例子调通了,费了挺大的劲儿,因为好多插件出了新的版本,而新版本中有的函数、方法又失效了。
  自已又练习着做了一个例子,个人记账系统。主要是想在手机上用,所以界面做得很简单。
  解决了以下一些问题:express使用、bootstrap排版布局、mongodb模糊查询、mongodb统计(group/mapReduce)、session处理、req.flash方法使用等、路由设置等。花了不少的心思。
  例子中用到的插件的版本:
  connect-flash@0.1.1
  connect-mongo@0.4.0
  ejs@0.8.5
  express@3.4.8
  mongodb@1.3.23

  Bootstrap V3.0.3

  贴几张系统运行的图片,有图有真相嘛。













  核心代码贴一下:
一、app.js

/**
 * Module dependencies.
 */

var express = require('express');
var http = require('http');
var path = require('path');
var util=require('util');

var routes = require('./routes');
//var User = require('./modules/user.js');	
var settings=require('./Settings');

var MongoStore = require('connect-mongo')(express);
var flash = require('connect-flash');

var app = express();

//app.set('appTitle','老王个人记账系统');
app.locals.gAppTitle = settings.appName;
//这个没有使用
app.locals.gPageSize = settings.pageSize;
// all environments
app.set('port', process.env.PORT || 8484);
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.bodyParser());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(flash());
app.use(express.session({
	"secret":settings.cookieSecret,
	"store":new MongoStore({
		db:settings.db
	})
}));

app.use(function(req, res, next){
  //跟踪;
  //console.log("req.method="+req.method);
  //console.log("req.url="+req.url);
  //console.log("req.originalUrl="+req.originalUrl);
  var url = req.originalUrl;
  //简单地定义一个登录拦截器
  if ((url == "/month" || url=="/stat" || url=='/list' || url=='/record') && !req.session.user) {
  	  console.log("登录拦截器提示:必须登录,才能执行此项操作。");
  	  req.flash('error', '请先登录。');
      return res.redirect("/login");
  }
  
  res.locals.user = req.session.user;
  
  var error = req.flash('error');
  res.locals.error = error.length?error:null;
  //console.log("转移flash中的error值:"+error);
  
  var success = req.flash('success');
  res.locals.success = success.length?success:null;
  //console.log("转移flash中的success值:"+success);
  
  res.locals.session = req.session;
  next();
});

app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
//console.log(util.inspect(app));

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

//console.log('注册路由.');

routes(app);


http.createServer(app).listen(app.get('port'), function(){
	console.log();
	console.log();
	console.log('/**************************************************/');
	console.log('/*  我的第一个NODE.JS例子。BY 隔壁老王 2014-3-29  */');
	console.log('/*   欢迎访问我的博客:http://wallimn.iteye.com   */');
	console.log('/**************************************************/');
  	console.log('============服务启动成功,监听端口:' + app.get('port')+"============");
});


二、路由处理(routes\index.js)
var crypto = require('crypto');
var User = require('../modules/user.js');	
var Consume = require('../modules/consume.js');
/*
 * GET home page.
 */

module.exports = function(app) {
	app.get('/',function(req, res){
	  res.render('index', { title: '首页' });
	  /*
		res.render('login',{
			title:'用户登录',
		});
	  */
	  //res.redirect('/login');
	});

	
	app.get('/record',function(req,res){
		var user = req.session.user;
		if(!user){
			req.flash('error', '用户未登录,请登录。');
			return res.redirect('/login');
		}

		Consume.get(user.name,{limit:16}, function(err, records) {
			if (err) {
				req.flash('error', err);
				return res.redirect('/error');
			}
			res.render('record', {
				title: user.name,
				consumes: records,
			});
		});
	});
	
	//预处理,如果通过,再进行下一个。
	app.post('/record',checkLogin);

	app.post('/record', function(req, res) {
		var currentUser = req.session.user;
		var record = new Consume();
		record.loadFromReq(currentUser.name, req.body);
		record.save(function(err) {
			if (err) {
				req.flash('error', err);
				return res.redirect('/');
			}
			req.flash('success', '发表成功');
			res.redirect('/record');
		});
	});

	//这个应该去掉。留在这里当个后门吧
	//可以查看其他用户的数据
	app.get('/u/:user', function(req, res) {
		var username = req.params.user;
		if (!username) {
			req.flash('error', '未指定用户');
			return res.redirect('/error');
		}

		Consume.get(username,{limit:0}, function(err, records) {
			if (err) {
				req.flash('error', err);
				return res.redirect('/error');
			}
			console.log(records);
			res.render('list', {
				title: username,
				consumes: records,
			});
		});
	});
	
	app.get('/del/:id', function(req, res) {
		var id = req.params.id;
		if (!id) {
			req.flash('error', '未指定要删除的记录ID');
			return res.redirect('/error');
		}
		
		console.log("准备删除记账记录,_id="+id);
		Consume.del(id, function(err, records) {
			if (err) {
				req.flash('error', err);
				return res.redirect('/error');
			}
			res.redirect('/record');;
		});
	});
	
	app.get('/logout',function(req,res){
		req.session.user = null;
		req.flash('success','登出成功');
		res.redirect('/login');
	});
	
	app.get('/list',function(req,res){
		var user = req.session.user;
		if(!user){
				req.flash('error', "您没有登录,请登录。");
				console.log("没有登录,重定向的登录界面。");
				return res.redirect('/login');
		}
		Consume.get(user.name,{limit:0}, function(err, records) {
			if (err) {
				req.flash('error', err);
				return res.redirect('/error');
			}
			res.render('list', {
				title: user.name,
				consumes: records,
			});
		});
	});
	
	app.post('/search',function(req,res){
		var user = req.session.user;
		if(!user){
				req.flash('error', "您没有登录,请登录。");
				return res.redirect('/login');
		}
		var keyword = req.body.keyword;
		console.log("搜索关键字:"+keyword);
		Consume.get(user.name,{limit:0,keyword:keyword}, function(err, records) {
			if (err) {
				req.flash('error', err);
				return res.redirect('/error');
			}
			res.render('record', {
				title: user.name,
				consumes: records,
			});
		});
	});
	
	app.get('/stat',function(req,res){
		var user = req.session.user;
		Consume.stat(user.name, function(err, results) {
			if (err) {
				req.flash('error', err);
				return res.redirect('/error');
			}
			res.render('stat', {
				title: user.name,
				results: results,
			});
		});
	});
	
	app.get('/month',function(req,res){
		var user = req.session.user;
		Consume.month(user.name, function(err, results) {
			if (err) {
				req.flash('error', err);
				return res.redirect('/error');
			}
			res.render('stat', {
				title: user.name,
				results: results,
			});
		});
	});
	
	app.get('/error',function(req,res){
		res.render('error');
	});

	//处理用户登录。
	app.post('/login',function(req,res){
		var md5=crypto.createHash('md5');
		var password = md5.update(req.body.password).digest('hex');
		
		User.get(req.body.username,function(err,user){
			if(!user){
				req.flash('error','用户不存在');
				return res.redirect('/login');
			}
			
			if(user.password!=password){
				req.flash('error','用户口令错误');
				return res.redirect('/login');
			}
			
			req.session.user = user;
			req.flash('success','登入成功');
			//res.redirect('/');
			res.redirect('/record');
		});
	});

	app.get('/login',function(req,res){
		res.render('login',{
			title:'用户登录',
		});
	});

	app.get('/reg',function(req,res){
		
		res.render('reg',{
			title:'用户注册'
		});
	});

	app.post('/reg',function(req,res){
		if(req.body['password-repeat']!=req.body['password']){
			req.flash('error','两次输入的口令不一致!');
			return res.redirect('/reg');
		}
		
		var md5=crypto.createHash('md5');
		var password = md5.update(req.body.password).digest('hex');
		
		var newUser = new User({
			name:req.body.username,
			password:password,
		});
		
		User.get(newUser.name,function(err,user){
			if(user)
				err='同名用户已经存在,请更换名字.';
			if(err){
				req.flash('error',err);
				return res.redirect('/reg');
			}
			
			newUser.save(function(err){
				if(err){
					req.error=err;
					return res.redirect('/reg');
				}	
				req.session.user = newUser;
				req.flash('success','注册成功!');
				res.redirect('/record');
			});
		});
	});

	//测试函数
	app.get('/hello',function(req,res){
		res.send('The time is '+new Date().toString());
	});

	//测试函数
	app.get('/sayhello',function(req,res){
		res.send('hello '+req.params.username);
	});
	
};

//检查是否登入.
function checkLogin(req, res, next) {
	if (!req.session.user) {
		req.flash('error', '尚未登录,无法操作。');
		return res.redirect('/error');
	}
	next();
}

function checkNotLogin(req, res, next) {
	if (req.session.user) {
		req.flash('error', '已登入');
		return res.redirect('/');
	}
	next();
}


三、消费数据处理(modules\consume.js)
var mongodb = require('./db');
var BSON = require('mongodb').BSONPure;
var util=require('util');


function toObjectId(id){
	console.log("转换值:"+id);
	if( id=="" || id=="null" || id=="undefined" || id==undefined || id==null)return null;
	return BSON.ObjectID.createFromHexString(id);
}

function Consume(username, consumeDate,consumeSubject,consumeAmount,consumeRemark, time)
{
	//加载时要单独赋值
	this._id=null;
	
    this.userName = username;
    this.consumeDate = consumeDate;
    this.consumeSubject = consumeSubject;
    this.consumeAmount = consumeAmount;
    this.consumeRemark = consumeRemark;

    if (time)
    {
        this.time = time;
    }
    else
    {
        this.time = new Date();
    }
    
};
module.exports = Consume;

Consume.prototype.loadFromReq = function loadFromReq(username,reqBody,time){
	//自动进行了ID类型的转换。
	this._id = toObjectId(reqBody._id);
    this.userName = username;
    this.consumeDate = reqBody.consumeDate;
    this.consumeSubject = reqBody.consumeSubject;
    this.consumeAmount = reqBody.consumeAmount;
    this.consumeRemark = reqBody.consumeRemark;

    if (time)
    {
        this.time = time;
    }
    else
    {
        this.time = new Date();
    }
}

Consume.prototype.save = function save(callback)
{
    // 存入 Mongodb 的文档
    var record = 
    {
    	_id:this._id,
        userName: this.userName, 
        consumeDate: this.consumeDate, 
        consumeSubject: this.consumeSubject, 
        consumeAmount: this.consumeAmount, 
        consumeRemark: this.consumeRemark, 
        time: this.time, 
    };
    console.log('保存,记录日期:'+record.consumeDate);
    mongodb.open(function(err, db){
        if (err)
        {
            return callback(err); 
        }
        // 读取 posts 集合
        db.collection('consume', function(err, collection){
            if (err)
            {
                mongodb.close(); return callback(err); 
            }

            // 插入
            /*
            collection.insert(record, {safe: true} , function(err, post){
                mongodb.close(); callback(err, post); 
            }); 
            */
           
           console.log("插入或更新,判断依据_id="+record._id);
		   if(record._id==null){
		   	   delete record._id;
		   	   console.log("删除_id,record._id="+record._id);
		   }
           collection.update({_id:(record._id?record._id:'no-record')}, record, {upsert:true,multi:false} , function(err, post){
                mongodb.close(); callback(err, post); 
            }); 
        }); 
    });
};

//删除方法
Consume.del = function del(id,callback){
	mongodb.open(function(err,db){
        if (err){
            return callback(err); 
        }
        
		var query = {_id:BSON.ObjectID.createFromHexString(id)};
		
        db.collection('consume', function(err, collection){
            if (err){
                mongodb.close(); 
                return callback(err); 
            }

			collection.remove(query,{safe:true},function(err,result){
				mongodb.close();
		        if (err){
		            return callback(err); 
		        }
		        console.log("删除成功。");
				callback(null); 
		    }) ;
		});    
   	});
};



Consume.get = function get(username,options, callback)
{
    mongodb.open(function(err, db){
        if (err){
            return callback(err); 
        }
        // 读取 posts 集合
        db.collection('consume', function(err, collection){
            if (err){
                mongodb.close();
                return callback(err); 
            }

            var query = {};
            if(options.keyword){
            	//var regx = new RegExp("/"+options.keyword+"/");
            	//注意,不用/
            	var regx = new RegExp(options.keyword);
            	//限制用户名,科目或者金额与输入关键相等
				query={"$and":[{userName:username},
							   {"$or":[{consumeSubject:regx},
									   {consumeDate:regx},
							   		   {consumeAmount:options.keyword}
									  ]
							   }]
					   };
            }
            else{
                query.userName = username; 
            }
            console.log("搜索条件:");
            console.log(query);
            if(!options.limit){
            	options.limit=0;
            }
            collection.find(query).sort({consumeDate:-1 }).limit(options.limit).toArray(function(err, docs){
                mongodb.close(); 
                if (err){
                    callback(err, null); 
                }

                var consumes = []; 
                docs.forEach(function(doc, index){
                    var record = new Consume(doc.userName, doc.consumeDate,doc.consumeSubject,doc.consumeAmount,doc.consumeRemark, doc.time);
                 	record._id = doc._id;
                    consumes.push(record); 
                }); 
                callback(null, consumes); 
            }); 
        }); 
    });
};



Consume.stat = function stat(username, callback)
{
    mongodb.open(function(err, db){
        if (err){
            return callback(err); 
        }
        // 读取 posts 集合
        db.collection('consume', function(err, collection){
            if (err){
                mongodb.close();
                return callback(err); 
            }

			var reduce = function(obj,prev){
					prev.amount += isNaN(obj.consumeAmount)?0:Number(obj.consumeAmount);
					prev.count++;
			};
		
            collection.group(
            	[ 'consumeSubject' ],
        		{userName:username},
        		{count:0,amount:0},
            	reduce,
            	function(err, result){
                	mongodb.close(); 
	                if (err){
	                    callback(err, null); 
	                }
	                else{
	                	console.log(result[0]);
	                	var amount = 0,count=0;
	                	result.forEach(function (item,index){
	                		amount += item.amount;
	                		count += item.count;
	                	});
	                	result.push({consumeSubject:'【合计】',count:count,amount:amount});
	                	callback(null, result); 
	                }
	        });
        }); 
    });
};

Consume.month = function month(username, callback)
{
    mongodb.open(function(err, db){
        if (err){
            return callback(err); 
        }
        // 读取 posts 集合
        db.collection('consume', function(err, collection){
            if (err){
                mongodb.close();
                return callback(err); 
            }
            
			var map = function(){
				emit(this.consumeDate.substr(0,7),{amount:this.consumeAmount,count:1});
			};
			
			var reduce = function(key,vals){
				var val = 0,count=0;
				for(var i=0; i<vals.length;i++){
					val += isNaN(vals[i].amount)?0:Number(vals[i].amount);
					count++;
				}
				return {amount:val,count:count};
			}
			
			console.log("统计:"+username);
            collection.mapReduce(
            	map,
        		reduce,
        		{out: {replace : 'temp', readPreference : 'secondary', query:{userName:username}}},
            	function(err, collection){
	                if (err){
                		mongodb.close(); 
	                    callback(err, null); 
	                }
	                else{
	                	//console.log(collection);
	                	/*
	                	var amount = 0,count=0;
	                	result.forEach(function (item,index){
	                		amount += item.amount;
	                		count += item.count;
	                	});
	                	result.push({consumeSubject:'【合计】',count:count,amount:amount});
	                	*/
	                	
	            		var results = [];
	                	collection.find().toArray(function(err,docs){
	                		docs.forEach(function(item,idx){
	                			console.log(item);
	                			//为了共用结果页面,统一使用consumeSubject
		                		results.push({consumeSubject:item._id,amount:item.value.amount,count:item.value.count});
	                		});
	                		mongodb.close();
		                	callback(null, results); 
	                	});
	                }
	        });
        }); 
    });
};


  全部源码见附件。

  另,2014-04-02
  系统开发好了之后,找了个服务器部署了一下,老婆用得不错,原来不太喜欢记账,现在记账很积极。我就又把系统完善了一下,增加了翻页、权限控制功能,将几个按钮修改成图标,布局更紧凑了一些,使用全局变量保存系统名称,方便修改。
  • 大小: 61.2 KB
  • 大小: 77.5 KB
  • 大小: 53.5 KB
  • 大小: 42 KB
  • 大小: 47 KB
  • account.rar (297 KB)
  • 描述: 个人记账系统源码
  • 下载次数: 1012
  • microblog.rar (250.8 KB)
  • 描述: 调试通过的书中例子
  • 下载次数: 529
分享到:
评论
21 楼 dengfeng_dengfeng 2017-06-23  
纳尼  启动了 访问不了了啊  报这个错

/**************************************************/
/*  我的第一个NODE.JS例子。BY 隔壁老王 2014-3-29  */
/*   欢迎访问我的博客:http://wallimn.iteye.com   */
/**************************************************/
============服务启动成功,监听端口:8484============
C:\account\node_modules\_mongodb@1.3.23@mongodb\lib\mongodb\connection\base.js:2
42
        throw message;
        ^

Error: Error setting TTL index on collection : sessions
    at C:\account\node_modules\_connect-mongo@0.4.0@connect-mongo\lib\connect-mo
ngo.js:161:23
    at C:\account\node_modules\_mongodb@1.3.23@mongodb\lib\mongodb\db.js:1430:36

    at __executeInsertCommand (C:\account\node_modules\_mongodb@1.3.23@mongodb\l
ib\mongodb\db.js:1829:12)
    at Db._executeInsertCommand (C:\account\node_modules\_mongodb@1.3.23@mongodb
\lib\mongodb\db.js:1930:5)
    at C:\account\node_modules\_mongodb@1.3.23@mongodb\lib\mongodb\db.js:1427:14

    at C:\account\node_modules\_mongodb@1.3.23@mongodb\lib\mongodb\db.js:1560:7
    at C:\account\node_modules\_mongodb@1.3.23@mongodb\lib\mongodb\cursor.js:162
:16
    at commandHandler (C:\account\node_modules\_mongodb@1.3.23@mongodb\lib\mongo
db\cursor.js:706:16)
    at C:\account\node_modules\_mongodb@1.3.23@mongodb\lib\mongodb\db.js:1806:9
    at Server.Base._callHandler (C:\account\node_modules\_mongodb@1.3.23@mongodb
\lib\mongodb\connection\base.js:442:41)


20 楼 wallimn 2016-07-16  
a54409 写道
全tm错的

骚年,我运行是对的。看看是不是插件版本的问题。
19 楼 a54409 2016-06-28  
全tm错的
18 楼 os_rover 2016-05-19  
luguofei123@126.com
17 楼 os_rover 2016-05-19  
[color=olive]
[color=cyan][size=xx-small][align=right][/size][/color][/color]
引用
[list]
[*][img][url][/url][/img] :P :twisted: :idea: :P :? :)
[/list]
[/align]
16 楼 荆人七十 2016-05-17  
谢谢分享~
15 楼 wallimn 2016-03-07  
炫oO游侠 写道
王哥啊,学习你的资料中,目前已经运行起来了,但是程序经常出错,而且只能显示一条记录,编辑和删除还会导致崩溃,需要重启服务才行,请问你有完整的代码吗?或者能告知一下原因吗?我的邮箱503045550@qq.com

附件中是代码就是完整的代码,不能正常运行可能跟Node.js、以及使用插件的版本有关。
14 楼 炫oO游侠 2016-01-13  
王哥啊,学习你的资料中,目前已经运行起来了,但是程序经常出错,而且只能显示一条记录,编辑和删除还会导致崩溃,需要重启服务才行,请问你有完整的代码吗?或者能告知一下原因吗?我的邮箱503045550@qq.com
13 楼 lwf60925 2016-01-13  
老王哥,无法找到bson module是什么原因,我想问老王哥bson的版本有自己npm install 吗
12 楼 lwf60925 2015-12-26  
王哥,提交记录的时候,id变成no-record。然后每一次提交都直接修改这个了
11 楼 wallimn 2015-12-14  
鲁迅的围脖 写道
这是我的邮箱:luguofei123@126.com  谢谢老王哥了

后面是较新版本的软件,后来简单修改了一下。第一个文件是最初的版本。
10 楼 wallimn 2015-12-14  
鲁迅的围脖 写道
这是我的邮箱:luguofei123@126.com  谢谢老王哥了

上传了附件,你自己下载吧,不发邮件了。
9 楼 鲁迅的围脖 2015-12-11  
这是我的邮箱:luguofei123@126.com  谢谢老王哥了
8 楼 wallimn 2015-12-10  
鲁迅的围脖 写道
老王哥,能提供一下app的h5代码吗?

h5的代码什么意思?
留个邮箱,可以给你全部代码。
7 楼 鲁迅的围脖 2015-12-10  
老王哥,能提供一下app的h5代码吗?
6 楼 wallimn 2015-07-22  
可能是connect-mongo的版本问题,我当时试着是好的。试试我使用的版本。
mongo数据库表结构会自动生成。
5 楼 ilywmf 2015-07-22  
C:\Program Files\nodejs\node_modules\connect-mongo\node_modules\mongodb\lib\mong
odb\connection\base.js:242
        throw message;
              ^
Error: Error setting TTL index on collection : sessions
    at C:\Program Files\nodejs\node_modules\connect-mongo\lib\connect-mongo.js:1
61:23
    at C:\Program Files\nodejs\node_modules\connect-mongo\node_modules\mongodb\l
ib\mongodb\db.js:1430:36
    at __executeInsertCommand (C:\Program Files\nodejs\node_modules\connect-mong
o\node_modules\mongodb\lib\mongodb\db.js:1829:12)
    at Db._executeInsertCommand (C:\Program Files\nodejs\node_modules\connect-mo
ngo\node_modules\mongodb\lib\mongodb\db.js:1930:5)
    at C:\Program Files\nodejs\node_modules\connect-mongo\node_modules\mongodb\l
ib\mongodb\db.js:1427:14
    at C:\Program Files\nodejs\node_modules\connect-mongo\node_modules\mongodb\l
ib\mongodb\db.js:1560:7
    at C:\Program Files\nodejs\node_modules\connect-mongo\node_modules\mongodb\l
ib\mongodb\cursor.js:162:16

试了下个人记账系统源码,报错了,不知什么原因

另外,mongo数据库表结构呢,自动生成的吗?
4 楼 vickypig 2014-06-04  
express的版本啊。。。真心受不了
3 楼 wallimn 2014-05-31  
Unexpected token ILLEGAL
看看函数的接口参数数量、类型是否正确。
2 楼 vickypig 2014-05-28  
你好,记账这个,报错了。能看看是什么问题吗


E:\node\account\node_modules\mongodb\lib\mongodb\connection\repl_set\strategies\statistics_strategy.js:1
(function (exports, require, module, __filename, __dirname) {
                                                              ^
SyntaxError: Unexpected token ILLEGAL
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (E:\node\account\node_modules\mongodb\lib\mongodb\connection\repl_set\repl_set.js:9:26)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)

Process finished with exit code 8

相关推荐

    node.js入门最佳示例demo

    最佳node入门例子,用到了express + ejs + mysql,程序功能是给出音乐列表,音乐可以播放,可以上传音乐。程序中没有用到其它各种包,很单纯,而且项目的readme文件中对...把本程序研究清楚,node.js就可以算是入门了。

    新时期的node.js入门-李锴-书中示例代码

    2018年1月版,李锴著,《新时期的node.js入门》,书中所有示例的代码

    Node.js 实战

    本书一共分为四大部分, 由易入难, 循序渐进, 既适合 Node.js 新手入门, 也能让使用过 Node.js的开发者在阅读过程中收获 “惊喜"。如果你是一名初学者, 可以跟着书中的示例一步步成长;如果你是一名有经验的...

    node.js入门教程迷你书、node.js入门web应用开发完全示例

    对JavaScript处于初学阶段,并且完全是一个Node.js的新手。 这里指的适合对其他编程语言有一定经验的开发者,意思是说,本书不会对诸如数据类型、变量、控制结构等等之类非常基础的概念作介绍。要读懂本书,这些基础...

    node.js开发指南

    本书首先简要介绍 Node.js, 然后通过各种示例讲解 Node.js 的基本特性, 再用案例式教学的方式讲述如何用 Node.js 进行 Web 开发, 接着探讨一些 Node.js 进阶话题, 最后展示如何将一个 Node.js 应用部署到生产...

    Node.js+Vue+MySQL 新人入门参考项目

    本资源提供的是我自己项目的github地址,在线访问地址http://139.199.203.200:3333,一个Node做后台、前端用Vue、React(react只做了部分示例),数据库采用MySQL的小项目供新人入门参考,包括vue、node的常用语法,...

    node.js-prometheus-grafana-poc:使用Prometheus和Grafana POC监视Node.js

    该存储库包含一个示例Node.js应用程序,该应用程序集成了的并在上公开了。 度量标准由定期并通过监视仪表板可视化。 入门 启动Docker容器: docker-compose up -d 测试容器 可以通过访问Prometheus Grafana应该...

    Node.js开发之套接字(socket)编程入门示例

    本文实例讲述了Node.js套接字(socket)编程。分享给大家供大家参考,具体如下: Node.js的net模块提供了socket编程接口,方便我们利用较为底层的套接字接口来实现应用协议。这次我们看一个简单的回显服务器示例,包括...

    node.js入门实例helloworld详解

    主要介绍了node.js入门实例helloworld,较为详细的讲述了node.js简单输出示例helloworld的实现代码与运行方法,需要的朋友可以参考下

    适用于Node.js的可靠的高级Web爬网和抓取框架。-Node.js开发

    Webster概述Webster是使用Node.js编写的可靠的Web爬网和爬网...Docker快速入门提取示例Docker镜像:docker pull zhuyingda / webster-demo docker run -it zhuyingda / webster-demo这是有关Baid的抓取工具的简单演示

    MySQL数据库开发教程-基础概念、SQL语法和Node.js操作详解

    - 最后给出了Node.js操作MySQL数据库的代码示例。 适用人群: - 需要使用关系型数据库的软件开发人员 - 要学习MySQL数据库相关知识的学生或 enthusiast 使用场景: - 需要持久化存储和管理结构化数据的软件系统 ...

    nodejs-quickstart:此存储库包含Node.js快速入门博客文章系列的代码示例

    快速入门:Node.js和MongoDB 该存储库将引导您快速一起使用Node.js和MongoDB。 一直在积极地向该仓库添加文件,并起草了一系列博客,以指导您完成代码。 她将在发布博客文章时更新此自述文件。 话题 如何连接到...

    Node.js中的不安全跳转如何防御详解

    安全是不容忽视的,每个开发者都知道它非常重要,真正严肃对待它的却没有几人。下面这篇文章主要给大家介绍了关于Node.js中不安全跳转如何防御的相关资料,文中通过示例代码介绍的非常详细。需要的朋友可以参考下

    示例:Node.js的Metarhia应用程序示例

    用于Node.js的Metarhia示例服务器 概念 这是的逻辑延续,是软件开发课程所有系统代码转移到依赖项(即使用)的逻辑延续。 您可以从该入门工具包开始开发,但要牢记将来的生产部署,并将应用程序进一步迁移到基于...

    Node入门示例源码.zip

    Node入门示例源码 《一篇入门Nodejs可不可行?》演示用的到示例源码

    详解Node.js使用token进行认证的简单示例

    本文只介绍简单的应用,关于json web token的具体介绍以及原理请参考阮一峰老师的JSON Web Token 入门教程。 使用的Node框架是koa2,前端发送ajax请求使用axios 首先创建工程目录: static中存放静态资源,views...

    Node-Talk:使用 Node.js 的开放指南

    Node.js从环境搭建,到基础入门,再到设计实现的小教程,旨在帮助新手入门、帮助新手实现以Node为主力开发环境、提升Node在大学生圈内的学习氛围。 同时,你可以在本项目中发布issue,提问任何有关Node的问题,我和...

Global site tag (gtag.js) - Google Analytics