国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Nodejs+Express學(xué)習(xí)二(Mongoose基礎(chǔ)了解)

LiangJ / 3431人閱讀

摘要:學(xué)習(xí)注定少不了與數(shù)據(jù)庫(kù)打交道,而和可以說(shuō)是絕配,這篇主要是簡(jiǎn)單介紹這個(gè)模塊。通過(guò)創(chuàng)建查詢(xún)是數(shù)據(jù)庫(kù)中運(yùn)用最多也是最麻煩的地方,這里對(duì)解讀的并不完善,僅僅是自己的一點(diǎn)領(lǐng)悟而已。

學(xué)習(xí)Node注定少不了與數(shù)據(jù)庫(kù)打交道,而MongoDBNode可以說(shuō)是絕配,這篇主要是簡(jiǎn)單介紹Mongoose這個(gè)模塊。
由于本人也是邊學(xué)邊寫(xiě)的這篇文章,絕對(duì)會(huì)有新手的味道,請(qǐng)大神看到這里就表往下看了。

名詞介紹
稍微翻閱下mongoose文檔就會(huì)看到Schema、Model、Entity這幾個(gè)名詞,文章主要圍繞這幾個(gè)詞展開(kāi),所以有必要解釋一下:

Schema:一種以文件形式存儲(chǔ)的數(shù)據(jù)庫(kù)模型骨架,不具備數(shù)據(jù)庫(kù)的操作能力
Model:由Schema發(fā)布生成的模型,具有抽象屬性和行為的數(shù)據(jù)庫(kù)操作對(duì)
Entity :由Model創(chuàng)建的實(shí)體,他的操作也會(huì)影響數(shù)據(jù)庫(kù)

我們?cè)趯?xiě)這些代碼時(shí),盡量用嚴(yán)格的命名方式來(lái)區(qū)別不同對(duì)象:

var PersonSchema;   //Person的文本屬性
var PersonModel;    //Person的數(shù)據(jù)庫(kù)模型
var PersonEntity;   //Person實(shí)體

Schema、Model、Entity的關(guān)系請(qǐng)牢記,Schema生成Model,Model創(chuàng)造Entity,ModelEntity都可對(duì)數(shù)據(jù)庫(kù)操作造成影響,但ModelEntity更具操作性。

下面正式步入正題:
首先你必須安裝MongoDB和NodeJS
安裝完成MongoDB后,創(chuàng)建一個(gè)名為test的數(shù)據(jù)庫(kù)(這里不介紹怎么安裝MongoDB,可以猛點(diǎn)這里查看MongoDB安裝)
在項(xiàng)目中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接,如下:

var mongoose = require("mongoose");    //引用mongoose模塊
var db = mongoose.createConnection("localhost","test"); //創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接

打開(kāi)本機(jī)localhost的test數(shù)據(jù)庫(kù)時(shí),我們可以監(jiān)測(cè)是否有異常

db.on("error",console.error.bind(console,"連接錯(cuò)誤:"));
db.once("open",function(){
  //一次打開(kāi)記錄
});

定義一個(gè)Schema

var PersonSchema = new mongoose.Schema({
  name:String   //定義一個(gè)屬性name,類(lèi)型為String
});

將該Schema發(fā)布為Model

var PersonModel = db.model("Person",PersonSchema);
//如果該Model已經(jīng)發(fā)布,則可以直接通過(guò)名字索引到,如下:
//var PersonModel = db.model("Person");
//如果沒(méi)有發(fā)布,上一段代碼將會(huì)異常

我們甚至可以為此Schema創(chuàng)建方法

//為Schema模型追加speak方法
PersonSchema.methos.speak = function(){
  console.log("我的名字叫"+this.name);
}
var PersonModel = db.model("Person",PersonSchema);
var personEntity = new PersonModel({name:"Krouky"});
personEntity.speak();//我的名字叫Krouky

Entity是具有具體的數(shù)據(jù)庫(kù)操作CRUD的

personEntity.save();  //執(zhí)行完成后,數(shù)據(jù)庫(kù)就有該數(shù)據(jù)了

如果要執(zhí)行查詢(xún),需要依賴(lài)Model,當(dāng)然Entity也是可以做到的

PersonModel.find(function(err,persons){
  //查詢(xún)到的所有person
});

逐一介紹

Schema——純潔的數(shù)據(jù)庫(kù)原型

我理解Schema僅僅只是一斷代碼,他書(shū)寫(xiě)完成后程序依然無(wú)法使用,更無(wú)法通往數(shù)據(jù)庫(kù)端

他僅僅只是數(shù)據(jù)庫(kù)模型在程序片段中的一種表現(xiàn),或者是數(shù)據(jù)屬性模型

如何定義Schema

var BlogSchema = new Schema({
  title:String,
  author:String
  //new Schema()中傳入一個(gè)JSON對(duì)象,該對(duì)象形如 xxx:yyyy ,
  /xxx是一個(gè)字符串,定義了屬性,yyy是一個(gè)Schema.Type,定義了屬性類(lèi)型
});

什么是Schema.Type
NodeJS中的基本數(shù)據(jù)類(lèi)型都屬于Schema.Type,另外Mongoose還定義了自己的類(lèi)型

//舉例:
var ExampleSchema = new Schema({
  name:String,
  binary:Buffer,
  living:Boolean,
  updated:Date,
  age:Number,
  mixed:Schema.Types.Mixed, //該混合類(lèi)型等同于nested
  _id:Schema.Types.ObjectId,  //主鍵
  _fk:Schema.Types.ObjectId,  //外鍵
  array:[],
  arrOfString:[String],
  arrOfNumber:[Number],
  arrOfDate:[Date],
  arrOfBuffer:[Buffer],
  arrOfBoolean:[Boolean],
  arrOfMixed:[Schema.Types.Mixed],
  arrOfObjectId:[Schema.Types.ObjectId]
  nested:{
    stuff:String,
  }
});

關(guān)于Mixed
Schema.Types.MixedMongoose定義個(gè)混合類(lèi)型,該混合類(lèi)型如果未定義具體形式。因此,如果定義具體內(nèi)容,就直接使用{}來(lái)定義,以下兩句等價(jià)

var AnySchema = new Schema({any:{}});
var AnySchema = new Schema({any:Schema.Types.Mixed});

混合類(lèi)型因?yàn)闆](méi)有特定約束,因此可以任意修改,一旦修改了原型,則必須調(diào)用markModified()

person.anything = {x:[3,4,{y:"change"}]}
person.markModified("anything");//傳入anything,表示該屬性類(lèi)型發(fā)生變化
person.save();

關(guān)于ObjectId
主鍵,一種特殊而且非常重要的類(lèi)型,每個(gè)Schema都會(huì)默認(rèn)配置這個(gè)屬性,屬性名為_id,除非自己定義,方可覆蓋

var mongoose = require("mongoose");
var ObjectId = mongoose.Schema.Types.ObjectId;
var StudentSchema = new Schema({}); //默認(rèn)會(huì)有_id:ObjectId
var TeacherSchema = new Schema({id:ObjectId});//只有id:ObjectId

該類(lèi)型的值由系統(tǒng)自己生成,從某種意義上幾乎不會(huì)重復(fù),生成過(guò)程比較復(fù)雜,有興趣的朋友可以查看源碼。

關(guān)于Array
ArrayJavaScript編程語(yǔ)言中并不是數(shù)組,而是集合,因此里面可以存入不同的值,以下代碼等價(jià):

var ExampleSchema1 = new Schema({array:[]});
var ExampleSchema2 = new Schema({array:Array});
var ExampleSchema3 = new Schema({array:[Schema.Types.Mixed]});
var ExampleSchema4 = new Schema({array:[{}]});

Schema不僅定義了文檔結(jié)構(gòu)和使用性能,還可以有擴(kuò)展插件、實(shí)例方法、靜態(tài)方法、復(fù)合索引、文檔生命周期鉤子

Schema可以定義插件,并且插件具有良好的可拔插性,請(qǐng)有興趣的讀者繼續(xù)往后閱讀或者查閱官方資料。

實(shí)例方法
有的時(shí)候,我們創(chuàng)造的Schema不僅要為后面的Model和Entity提供公共的屬性,還要提供公共的方法。

下面例子比快速通道的例子更加高級(jí),可以進(jìn)行高級(jí)擴(kuò)展:

var PersonSchema = new Schema({name:String,type:String});
//查詢(xún)類(lèi)似數(shù)據(jù)
PersonSchema.methods.findSimilarTypes = function(cb){
  return this.model("Person").find({type:this.type},cb);
}

使用如下:

var PersonModel = mongoose.model("Person",PersonSchema);
var krouky = new PersonSchema({name:"krouky",type:"前端工程師"});
krouky.findSimilarTypes(function(err,persons){
  //persons中就能查詢(xún)到其他前端工程師
});   

靜態(tài)方法
靜態(tài)方法在Model層就能使用,如下:

  PersonSchema.statics.findByName = function(name,cb){
    this.find({name:new RegExp(name,"i"),cb});
  }
  var PersonModel = mongoose.model("Person",PersonSchema);
  PersonModel.findByName("krouky",function(err,persons){
    //找到所有名字叫krouky的人
  });  

索引
索引或者復(fù)合索引能讓搜索更加高效,默認(rèn)索引就是主鍵索引ObjectId,屬性名為_id

虛擬屬性
Schema中如果定義了虛擬屬性,那么該屬性將不寫(xiě)入數(shù)據(jù)庫(kù),例如:

var PersonSchema = new Schema({
  name:{
    first:String,
    last:String
  }
});
var PersonModel = mongoose.model("Person",PersonSchema);
var krouky = new PersonModel({
  name:{first:"krouky",last:"han"}
});

如果每次想使用全名就得這樣

console.log(krouky.name.first + " " + krouky.name.last);

顯然這是很麻煩的,我們可以定義虛擬屬性:

 PersonSchema.virtual("name.full").get(function(){
  return this.name.first + " " + this.name.last;
});

那么就能用krouky.name.full來(lái)調(diào)用全名了,反之如果知道full,也可以反解first和last屬性

PersonSchema.virtual("name.full").set(function(name){
  var split = name.split(" ");
  this.name.first = split[0];
  this.name.last = split[1];
});
var PersonModel = mongoose.model("Person",PersonSchema);
var krouky = new PersonModel({});
krouky.name.full = "krouky han";//會(huì)被自動(dòng)分解
console.log(krouky.name.first);//krouky    

配置項(xiàng)
在使用new Schema(config)時(shí),我們可以追加一個(gè)參數(shù)options來(lái)配置Schema的配置,形如:

var ExampleSchema = new Schema(config,options);

或者使用

var ExampleSchema = new Schema(config);
ExampleSchema.set(option,value);

可供配置項(xiàng)有:safestrict、capped、versionKeyautoIndex

safe——安全屬性(默認(rèn)安全)

一般可做如下配置:

new Schema({...},{safe:true});

當(dāng)然我們也可以這樣

new Schema({...},{safe:{j:1,w:2,wtimeout:10000}});

j表示做1份日志,w表示做2個(gè)副本(尚不明確),超時(shí)時(shí)間10秒

strict——嚴(yán)格配置(默認(rèn)啟用)

確保Entity的值存入數(shù)據(jù)庫(kù)前會(huì)被自動(dòng)驗(yàn)證,如果你沒(méi)有充足的理由,請(qǐng)不要停用,例子:

var ThingSchema = new Schema({a:String});
var ThingModel = db.model("Thing",SchemaSchema);
var thing = new Thing({iAmNotInTheThingSchema:true});
thing.save();//iAmNotInTheThingSchema這個(gè)屬性將無(wú)法被存儲(chǔ)

如果取消嚴(yán)格選項(xiàng),iAmNotInTheThingSchema將會(huì)被存入數(shù)據(jù)庫(kù)
該選項(xiàng)也可以在構(gòu)造實(shí)例時(shí)使用,例如:

var ThingModel = db.model("Thing");
var thing1 = new ThingModel(doc,true);  //啟用嚴(yán)格
var thing2 = new ThingModel(doc,false); //禁用嚴(yán)格

注意:strict也可以設(shè)置為throw,表示出現(xiàn)問(wèn)題將會(huì)拋出錯(cuò)誤
shardKey
需要mongodb做分布式,才會(huì)使用該屬性

capped——上限設(shè)置
如果有數(shù)據(jù)庫(kù)的批量操作,該屬性能限制一次操作的量,例如:

new Schema({...},{capped:1024});  //一次操作上線1024條數(shù)據(jù)

當(dāng)然該參數(shù)也可是JSON對(duì)象,包含size、max、autiIndexId屬性

new Schema({...},{capped:{size:1024,max:100,autoIndexId:true}});

versionKey——版本鎖
版本鎖是Mongoose默認(rèn)配置(__v屬性)的,如果你想自己定制,如下:

new Schema({...},{versionKey:"__someElse"});

此時(shí)存入數(shù)據(jù)庫(kù)的版本鎖就不是__v屬性,而是__someElse,相當(dāng)于是給版本鎖取名字。
具體怎么存入都是由MongooseMongoDB自己決定,當(dāng)然,這個(gè)屬性你也可以去除

  new Schema({...},{versionKey:false});

除非你知道你在做什么,并且你知道這樣做的后果
更新
有許多方式來(lái)更新文件,以下是常用的傳統(tǒng)方式:

PersonModel.findById(id,function(err,person){
  person.name = "MDragon";
  person.save(function(err){});
}); 

這里,利用Model模型查詢(xún)到了person對(duì)象,該對(duì)象屬于Entity,可以有save操作,如果使用Model操作,需注意:

PersonModel.findById(id,function(err,person){
  person.name = "MDragon";
  var _id = person._id; //需要取出主鍵_id
  delete person._id;    //再將其刪除
  PersonModel.update({_id:_id},person,function(err){});
  //此時(shí)才能用Model操作,否則報(bào)錯(cuò)
}); 

update第一個(gè)參數(shù)是查詢(xún)條件,第二個(gè)參數(shù)是更新的對(duì)象,但不能更新主鍵,這就是為什么要?jiǎng)h除主鍵的原因。
當(dāng)然這樣的更新很麻煩,可以使用$set屬性來(lái)配置,這樣也不用先查詢(xún),如果更新的數(shù)據(jù)比較少,可用性還是很好的:

PersonModel.update({_id:_id},{$set:{name:"MDragon"}},function(err){}); 

需要注意,Document的CRUD操作都是異步執(zhí)行,callback第一個(gè)參數(shù)必須是err,而第二個(gè)參數(shù)各個(gè)方法不一樣,update的callback第二個(gè)參數(shù)是更新的數(shù)量,如果要返回更新后的對(duì)象,則要使用如下方法

 Person.findByIdAndUpdate(_id,{$set:{name:"MDragon"}},function(err,person){
  console.log(person.name); //MDragon
});

類(lèi)似的方法還有findByIdAndRemove,如同名字,只能根據(jù)id查詢(xún)并作update/remove操作,操作的數(shù)據(jù)僅一條
新增
如果是Entity,使用save方法,如果是Model,使用create方法

//使用Entity來(lái)增加一條數(shù)據(jù)
var krouky = new PersonModel({name:"krouky"});
krouky.save(callback);
//使用Model來(lái)增加一條數(shù)據(jù)
var MDragon = {name:"MDragon"};
PersonModel.create(MDragon,callback);

兩種新增方法區(qū)別在于,如果使用Model新增時(shí),傳入的對(duì)象只能是純凈的JSON對(duì)象,不能是由Model創(chuàng)建的實(shí)體,原因是:由Model創(chuàng)建的實(shí)體krouky雖然打印是只有{name:"krouky"},但是krouky屬于Entity,包含有Schema屬性和Model數(shù)據(jù)庫(kù)行為模型。如果是使用Model創(chuàng)建的對(duì)象,傳入時(shí)一定會(huì)將隱藏屬性也存入數(shù)據(jù)庫(kù),雖然3.x追加了默認(rèn)嚴(yán)格屬性,但也不必要增加操作的報(bào)錯(cuò)
刪除
和新增一樣,刪除也有2種方式,但EntityModel都使用remove方法
Sub Docs
如同SQL數(shù)據(jù)庫(kù)中2張表有主外關(guān)系,Mongoose將2個(gè)Document的嵌套叫做Sub-Docs(子文檔)
簡(jiǎn)單的說(shuō)就是一個(gè)Document嵌套另外一個(gè)Document或者Documents:

var ChildSchema1 = new Schema({name:String});
var ChildSchema2 = new Schema({name:String});
var ParentSchema = new Schema({
  children1:ChildSchema1,   //嵌套Document
  children2:[ChildSchema2]  //嵌套Documents
});

Sub-Docs享受和Documents一樣的操作,但是Sub-Docs的操作都由父類(lèi)去執(zhí)行

var ParentModel = db.model("Parent",parentSchema);
var parent = new ParentModel({
  children2:[{name:"c1"},{name:"c2"}]
});
parent.children2[0].name = "d";
parent.save(callback);

parent在執(zhí)行保存時(shí),由于包含children2,他是一個(gè)數(shù)據(jù)庫(kù)模型對(duì)象,因此會(huì)先保存chilren2[0]chilren2[1]。
如果子文檔在更新時(shí)出現(xiàn)錯(cuò)誤,將直接報(bào)在父類(lèi)文檔中,可以這樣處理:

ChildrenSchema.pre("save",function(next){
  if("x" === this.name) return next(new Error("#err:not-x"));
  next();
});
var parent = new ParentModel({children1:{name:"not-x"}});
parent.save(function(err){
  console.log(err.message); //#err:not-x
});  

查詢(xún)子文檔
如果childrenparent的子文檔,可以通過(guò)如下方法查詢(xún)到children

var child = parent.children.id(id);

新增、刪除、更新
子文檔是父文檔的一個(gè)屬性,因此按照屬性的操作即可,不同的是在新增父類(lèi)的時(shí)候,子文檔是會(huì)被先加入進(jìn)去的。
如果ChildrenSchema是臨時(shí)的一個(gè)子文檔,不作為數(shù)據(jù)庫(kù)映射集合,可以這樣:

var ParentSchema = new Schema({
  children:{
    name:String
  }
});
//其實(shí)就是匿名混合模式

Model
什么是Model
Model模型,是經(jīng)過(guò)Schema構(gòu)造來(lái)的,除了Schema定義的數(shù)據(jù)庫(kù)骨架以外,還具有數(shù)據(jù)庫(kù)行為模型,他相當(dāng)于管理數(shù)據(jù)庫(kù)屬性、行為的類(lèi)

如何創(chuàng)建Model
你必須通過(guò)Schema來(lái)創(chuàng)建,如下:

//先創(chuàng)建Schema
var TankSchema = new Schema({
  name:"String",
  size:"String" 
});
//通過(guò)Schema創(chuàng)建Model
var TankModel = mongoose.model("Tank",TankSchema);

操作Model
該模型就能直接拿來(lái)操作,具體查看API,例如:

var tank = {"something",size:"small"};
TankModel.create(tank);

注意: 你可以使用Model來(lái)創(chuàng)建EntityEntity實(shí)體是一個(gè)特有Model具體對(duì)象,但是他并不具備Model的方法,只能用自己的方法。

  //通過(guò)Model創(chuàng)建Entity
  var tankEntity = new TankModel("someother","size:big");
  tankEntity.save();

Query
查詢(xún)是數(shù)據(jù)庫(kù)中運(yùn)用最多也是最麻煩的地方,這里對(duì)Query解讀的并不完善,僅僅是自己的一點(diǎn)領(lǐng)悟而已。

查詢(xún)的方式
通常有2種查詢(xún)方式,一種是直接查詢(xún),一種是鏈?zhǔn)讲樵?xún)(2種查詢(xún)都是自己命名的)

直接查詢(xún):在查詢(xún)時(shí)帶有回調(diào)函數(shù)的,稱(chēng)之為直接查詢(xún),查詢(xún)的條件往往通過(guò)API來(lái)設(shè)定,例如:
PersonModel.findOne({"name.last":"dragon"},"some select",function(err,person){

 //如果err==null,則person就能取到數(shù)據(jù)

});
具體的查詢(xún)參數(shù),請(qǐng)查詢(xún)API

鏈?zhǔn)讲樵?xún)?cè)诓樵?xún)時(shí)候,不帶回調(diào),而查詢(xún)條件通過(guò)API函數(shù)來(lái)制定,例如:

   var query = PersonModel.findOne({"name.last":"dragon"});
   query.select("some select");
   query.exec(function(err,pserson){
       //如果err==null,則person就能取到數(shù)據(jù)
 });
 

這種方式相對(duì)直接查詢(xún),分的比較明細(xì),如果不帶callback,則返回query,query沒(méi)有執(zhí)行的預(yù)編譯查詢(xún)語(yǔ)句,該query對(duì)象執(zhí)行的方法都將返回自己,只有在執(zhí)行exec方法時(shí)才執(zhí)行查詢(xún),而且必須有回調(diào)。

因?yàn)?b>query的操作始終返回自身,我們可以采用更形象的鏈?zhǔn)綄?xiě)法

Person
  .find({ occupation: /host/ })
  .where("name.last").equals("Ghost")
  .where("age").gt(17).lt(66)
  .where("likes").in(["vaporizing", "talking"])
  .limit(10)
  .sort("-occupation")
  .select("name occupation")
  .exec(callback);
  

Validation

驗(yàn)證始終定義在SchemaType

驗(yàn)證是一個(gè)內(nèi)部中間件

驗(yàn)證是在一個(gè)Document被保存時(shí)默認(rèn)啟用的,除非你關(guān)閉驗(yàn)證

驗(yàn)證是異步遞歸的,如果你的SubDoc驗(yàn)證失敗,Document也將無(wú)法保存

驗(yàn)證并不關(guān)心錯(cuò)誤類(lèi)型,而通過(guò)ValidationError這個(gè)對(duì)象可以訪問(wèn)

驗(yàn)證器

required 非空驗(yàn)證

min/max 范圍驗(yàn)證(邊值驗(yàn)證)

enum/match 枚舉驗(yàn)證/匹配驗(yàn)證

validate 自定義驗(yàn)證規(guī)則

以下是綜合案例:

var PersonSchema = new Schema({
  name:{
    type:"String",
    required:true //姓名非空
  },
  age:{
    type:"Nunmer",
    min:18,       //年齡最小18
    max:120     //年齡最大120
  },
  city:{
    type:"String",
    enum:["北京","上海"]  //只能是北京、上海人
  },
  other:{
    type:"String",
    validate:[validator,err]  //validator是一個(gè)驗(yàn)證函數(shù),err是驗(yàn)證失敗的錯(cuò)誤信息
  }
});

驗(yàn)證失敗
如果驗(yàn)證失敗,則會(huì)返回err信息,err是一個(gè)對(duì)象該對(duì)象屬性如下

err.errors                //錯(cuò)誤集合(對(duì)象)
err.errors.color          //錯(cuò)誤屬性(Schema的color屬性)
err.errors.color.message  //錯(cuò)誤屬性信息
err.errors.path             //錯(cuò)誤屬性路徑
err.errors.type             //錯(cuò)誤類(lèi)型
err.name                //錯(cuò)誤名稱(chēng)
err.message                 //錯(cuò)誤消息

一旦驗(yàn)證失敗,ModelEntity都將具有和err一樣的errors屬性

Middleware中間件
什么是中間件
中間件是一種控制函數(shù),類(lèi)似插件,能控制流程中的init、validate、save、`remove方法

Serial串行
串行使用pre方法,執(zhí)行下一個(gè)方法使用next調(diào)用

var schema = new Schema(...);
schema.pre("save",function(next){
  //做點(diǎn)什么
  next();
});

Parallel并行
并行提供更細(xì)粒度的操作

var schema = new Schema(...);
schema.pre("save",function(next,done){
  //下一個(gè)要執(zhí)行的中間件并行執(zhí)行
  next();
  doAsync(done);
});

中間件特點(diǎn)
一旦定義了中間件,就會(huì)在全部中間件執(zhí)行完后執(zhí)行其他操作,使用中間件可以霧化模型,避免異步操作的層層迭代嵌套

使用范疇

復(fù)雜的驗(yàn)證

刪除有主外關(guān)聯(lián)的doc

異步默認(rèn)

某個(gè)特定動(dòng)作觸發(fā)異步任務(wù),例如觸發(fā)自定義事件和通知

例如,可以用來(lái)做自定義錯(cuò)誤處理

schema.pre("save",function(next){
  var err = new Eerror("some err");
  next(err);
});
entity.save(function(err){
  console.log(err.message); //some err
});

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/18877.html

相關(guān)文章

  • Nodejs+Express學(xué)習(xí)Mongoose基礎(chǔ)了解

    摘要:學(xué)習(xí)注定少不了與數(shù)據(jù)庫(kù)打交道,而和可以說(shuō)是絕配,這篇主要是簡(jiǎn)單介紹這個(gè)模塊。通過(guò)創(chuàng)建查詢(xún)是數(shù)據(jù)庫(kù)中運(yùn)用最多也是最麻煩的地方,這里對(duì)解讀的并不完善,僅僅是自己的一點(diǎn)領(lǐng)悟而已。 學(xué)習(xí)Node注定少不了與數(shù)據(jù)庫(kù)打交道,而MongoDB和Node可以說(shuō)是絕配,這篇主要是簡(jiǎn)單介紹Mongoose這個(gè)模塊。由于本人也是邊學(xué)邊寫(xiě)的這篇文章,絕對(duì)會(huì)有新手的味道,請(qǐng)大神看到這里就表往下看了。 名詞介紹稍...

    617035918 評(píng)論0 收藏0
  • 全棧最后一公里 - Node.js 項(xiàng)目的線上服務(wù)器部署與發(fā)布

    摘要:沒(méi)有耐心閱讀的同學(xué),可以直接前往學(xué)習(xí)全棧最后一公里。我下面會(huì)羅列一些,我自己錄制過(guò)的一些項(xiàng)目,或者其他的我覺(jué)得可以按照這個(gè)路線繼續(xù)深入學(xué)習(xí)的項(xiàng)目資源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技術(shù)軟文,閱讀需謹(jǐn)慎,長(zhǎng)約 7000 字,通讀需 5 分鐘 大家好,我是 Scott,本文通過(guò)提供給大家學(xué)習(xí)的方法,...

    Nosee 評(píng)論0 收藏0
  • 前端學(xué)習(xí)資源

    摘要:提供了完整的環(huán)境,并且支持自定義域名指向,動(dòng)態(tài)計(jì)算資源調(diào)整,可以完成各種應(yīng)用的開(kāi)發(fā)編譯與部署。 react 新特性 react16 Context 算法相關(guān) 圖解排序算法(二)之希爾排序 微信小程序 微信小程序組件化的解決方案移動(dòng)端尺寸基本知識(shí) 瀏覽器 前端必讀:瀏覽器內(nèi)部工作原理瀏覽器緩存原理解讀瀏覽器加載css和js及dom解析之間的關(guān)系瀏覽器緩存 CSS學(xué)習(xí) 移動(dòng)web開(kāi)發(fā)布局入...

    zhisheng 評(píng)論0 收藏0
  • 通過(guò)nodeclub項(xiàng)目源碼來(lái)講解如何做一個(gè)nodejs + express + mongodb項(xiàng)目

    摘要:是的源碼,算是一個(gè)基本的博客系統(tǒng),包含文章發(fā)布,關(guān)注,評(píng)論等功能。這些功能可以說(shuō)是任何一個(gè)網(wǎng)站的基礎(chǔ)。比如運(yùn)營(yíng)數(shù)據(jù)配置和其他數(shù)據(jù)配置分開(kāi),因?yàn)楹苡锌赡苄枰鲆粋€(gè)小的工具來(lái)讓非技術(shù)人員配置相關(guān)參數(shù)。模式在中有一個(gè)專(zhuān)門(mén)的章節(jié)來(lái)講解。 1. About 1.1 what: nodeclub是cnodejs.com的源碼,cnode算是一個(gè)基本的博客系統(tǒng),包含文章發(fā)布, 關(guān)注,評(píng)論等功能...

    kaka 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<