`
收藏列表
标题 标签 来源
app.module.ts angular, nodejs, redis
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule,FormsModule } from '@angular/forms';

import { AppComponent } from './app.component';
import { ProductComponent } from './product/product.component';

// 引入
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

import { TableModule } from 'primeng/table';
import { InputTextModule } from 'primeng/inputtext';
import { ButtonModule } from 'primeng/button';
import { DialogModule } from 'primeng/dialog';
import { DropdownModule } from 'primeng/primeng';
import { MessageService } from 'primeng/api';
import {ToastModule} from 'primeng/toast';

import { HttpClientModule } from '@angular/common/http';


@NgModule({
  declarations: [
    AppComponent,
    ProductComponent
  ],
  imports: [
    BrowserModule, 
    ReactiveFormsModule,
    BrowserAnimationsModule,
    TableModule,
    InputTextModule,
    ButtonModule,
    DialogModule,
    FormsModule,
    HttpClientModule,
    DropdownModule,
    ToastModule
  ],
  providers: [MessageService],
  bootstrap: [AppComponent]
})
export class AppModule { }
angular - package.json angular, nodejs, redis
{
  "name": "angular",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve --proxy-config proxy.conf.json",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^8.1.2",
    "@angular/cdk": "^8.1.1",
    "@angular/common": "~8.1.2",
    "@angular/compiler": "~8.1.2",
    "@angular/core": "^8.1.2",
    "@angular/forms": "~8.1.2",
    "@angular/platform-browser": "~8.1.2",
    "@angular/platform-browser-dynamic": "~8.1.2",
    "@angular/router": "~8.1.2",
    "bootstrap": "^4.0.0-alpha.4",
    "chart.js": "^2.8.0",
    "core-js": "^2.5.4",
    "font-awesome": "^4.7.0",
    "jquery": "^1.9.1",
    "node-sass": "^4.12.0",
    "popper.js": "^1.14.7",
    "primeicons": "^1.0.0",
    "primeng": "^8.0.1",
    "quill": "^1.3.6",
    "rxjs": "^6.5.2",
    "rxjs-compat": "^6.3.3",
    "tslib": "^1.9.0",
    "zone.js": "~0.9.1"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.801.2",
    "@angular/cli": "~8.1.2",
    "@angular/compiler-cli": "~8.1.2",
    "@angular/language-service": "~8.1.2",
    "@types/node": "~8.9.4",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "^5.0.1",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.4.5"
  }
}
index.html angular, nodejs, redis
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Angular</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
</head>
<body>
  <app-root></app-root>
</body>
</html>
CleanCode & Refactor cleancode, refactor
if ((platform.toUpperCase().indexOf("MAC") > -1) &&
	(platform.toUpperCase().indexOf("IE") > -1) &&
	wasInitialized() && resize > 0)
{
	//do something
}


final boolean isMaxOS	= platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrower= platform.toUpperCase().indexOf("IE") > -1;
final boolean wasResized= resize > 0;

if (isMaxOS && isIEBrower && wasInitialized() && wasResized)
{
	//do something
}



if (date.before (SUMMER_START) || date.after(SUMMER_END))
	charge = quantity * _winterRate + _winterServiceCharge;
else
	charge = quantity * _summerRate;


if (notSummer(date))
	charge = winterCharge(quantity);
else 
	charge = summerCharge(quantity);



if ( (document.AtEndOfStream) && (NoInputError) && 
	((MIN_LINES <= lineCount) && (lineCount <= MAX_LINES)) &&
	(NoErrorProcessing())
	)
{
	//do something
}

boolean isValidatedDocument()
{
	return (document.AtEndOfStream) && (NoInputError) && 
			((MIN_LINES <= lineCount) && (lineCount <= MAX_LINES)) &&
			(NoErrorProcessing());
}

if (isValidatedDocument())
{
	//do something
}


void doThisOrThat(boolean flag) {
	if (flag)
		doThis();
	else
		doThat();
}


人工智能小程序 python
# coding=UTF-8
import requests, json, time, random

import sys
type = sys.getfilesystemencoding()
#print myname.decode('UTF-8').encode(type)

feature_text = '''
大家好!我是你的聊天机器人吴小枫。

我有问必答,有人会问我“今天深圳天气怎么样?”,也有人问我“你喜欢我吗?”
快来问我问题呀,欢迎来撩!

【温馨提示】如果你要删除自己输入的内容,要按两次删除,才可以删掉一个汉字奥!
(因为在计算机世界里,中文是占两个字符的!)
>'''

user1 = input(feature_text)
time.sleep(1)
userid = str(random.randint(1, 1000000000000000000000))
apikey = 'd81c0b99c260440980a140440be200ec'
#超过1w有风险,19-01-19
tulingdata1 = json.dumps({    "perception": {
        "inputText": {
            "text": user1
        },

    },
    "userInfo": {
        "apiKey": apikey,
        "userId": userid
    }
})
robot1 = requests.post('http://openapi.tuling123.com/openapi/api/v2', tulingdata1)
jsrobot1 = json.loads(robot1.text)['results'][0]['values']['text']
print(jsrobot1)
time.sleep(2)
user2 = input('''
再来问我点啥吧!我把我知道的都告诉你,嘻嘻!
>''')
tulingdata1 = json.dumps({
    "perception": {
        "inputText": {
            "text": user2
        },

    },
    "userInfo": {
        "apiKey": apikey,
        "userId": userid
    }
})
robot1 = requests.post('http://openapi.tuling123.com/openapi/api/v2', tulingdata1)
jsrobot1 = json.loads(robot1.text)['results'][0]['values']['text']
time.sleep(1)
print(jsrobot1)
user3 = input('''
我有点饿了,再和你聊完最后一句,我就要下线啦!你还有什么要问我的?
>''')
tulingdata1 = json.dumps({
    "perception": {
        "inputText": {
            "text": user3
        },

    },
    "userInfo": {
        "apiKey": apikey,
        "userId": userid
    }
})
robot1 = requests.post('http://openapi.tuling123.com/openapi/api/v2', tulingdata1)
jsrobot1 = json.loads(robot1.text)['results'][0]['values']['text']
time.sleep(1)
print(jsrobot1)
time.sleep(1)
print('\n我走啦,下次见!')
product.model.ts angular, nodejs, redis
export class Product {
  public id:number;
  public title:string;
  public price:number;
  public rating:number;
  public desc:string;

  constructor(
    // id:number,
    // title:string,
    // price:number,
    // rating:number,
    // desc:string
  ){}
}
product.ts angular, nodejs, redis
import * as redis from 'redis';
const db = redis.createClient();

export class Product {
  constructor(
    public id:number,
    public title:string,
    public price:number,
    public rating:number,
    public desc:string
  ){}

  static getRange(from, to, cb) {
    db.lrange('products', from, to, (err, items) => {
      if (err) return cb(err);
      let products = [];
      items.forEach((item) => {
        products.push(JSON.parse(item));
      });
      cb(null, products);
    });
  }

  static getProductByIndex(index, cb) {
    db.lindex('products', index, (err, item) => {
      if (err) return cb(err);
      cb(null, JSON.parse(item));
    });
  }

  static getMaxProductId(){
    return new Promise(function(resolve,reject){
      Product.getProductByIndex(0,(err, firstProduct) => {
        // console.log("firstProduct id is: " + firstProduct.id);
        if(err) {
          reject(err);
        }
        else{
          resolve(firstProduct.id);
        }        
      })
    });
  }

  static getProductIndex(product:Product){
    return new Promise(function(resolve,reject){
      Product.getRange(0, -1, (err, products) => {
        let index:number = 0;
        
        products.find((item) => {
          if(item.id == product.id)
            return true;
          index++;
        });
      
        if(err) {
          reject(err);
        }
        else{
          resolve(index);
        }        
      })
    });
  }

  save(cb) {
    const productJSON = JSON.stringify(this);
    db.lpush(
      'products',
      productJSON,
      (err) => {
        if (err) return cb(err);
        cb();
      }
    );
  }
    
  delete(cb) {
    const productJSON = JSON.stringify(this);
    db.lrem(
      'products',
      0,
      productJSON,
      (err) => {
        if (err) return cb(err);
        cb();
      }
    );
  }
    
  static count(cb) {
    db.llen('products', (err, count) => {
      if (err) return cb(err);
      cb(count)
    });
  }

  update(index, cb) {
    const productJSON = JSON.stringify(this);
    db.lset(
      'products',
      index,
      productJSON,
      (err) => {
        if (err) return cb(err);
        cb();
      }
    );
  }
}
actionServe.ts angular, nodejs, redis
import * as express from 'express';
import { Product } from './models/product';

const app = express();

var bodyParser = require('body-parser');
// var multer = require('multer');

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
// app.use(multer()); // for parsing multipart/form-data

app.get('/',(req, res) => {
    res.send("hello express");
});

app.get('/api/products',(req,res) => {
    Product.getRange(0, -1, (a, products) => {
        res.json(products);
    })
});


app.get('/api/products/:id',(req,res) => {
    Product.getRange(0, -1, (a, products) => {
        res.json(products.find((product) => product.id == req.params.id));
    })
});

app.post('/api/product', (req, res, next) => {
    console.log("save product: ", req.body.title);  

    Product.getMaxProductId()
    .then(
        function(currentMaxProductId){
            let MaxProductId = Number.parseInt(currentMaxProductId.toString()) + 1;
            const product = new Product(MaxProductId, req.body.title, req.body.price, req.body.rating, req.body.desc);

            product.save((err) => {
                if (err) return next(err);
                res.json("save product done");
            });
        }
        ,function(err){
            return next(err);
        }
    );
});

app.delete('/api/product/:product', (req, res, next) => {
    console.log("delete product: ", req.params.product);
  
    let productJSON = JSON.parse(req.params.product);  
    const product = new Product(productJSON.id, productJSON.title, productJSON.price, productJSON.rating, productJSON.desc);

    product.delete((err) => {
        if (err) return next(err);
        res.json('delete product done');
    });
});

app.put('/api/product/', (req, res, next) => {
    console.log("update product id ", req.body.id);
  
    const product = new Product(req.body.id, req.body.title, req.body.price, req.body.rating, req.body.desc);

    Product.getProductIndex(product)
    .then(
        function(index){
            console.log("index is: " + index );
            product.update(index, (err) => {
                if (err) return next(err);
                res.json('update product done');
            });
        }
        ,function(err){
            return next(err);
        }
    )
});


const serve = app.listen(8000,"localhost",() => {
    console.log("服务器已启动,地址为http://localhost:8000");
});
product.component.ts angular, nodejs, redis
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, FormArray, Validators, FormBuilder,FormsModule } from  '@angular/forms'; 

import { Observable } from 'rxjs';
import { HttpClient, HttpResponse, HttpHeaders } from '@angular/common/http';
import 'rxjs/Rx';
import { Product } from './product.model';
import { MessageService } from 'primeng/api';

// import { TableModule } from 'primeng/primeng';

@Component({
  selector: 'app-product',
  templateUrl: './product.component.html',
  styleUrls: ['./product.component.css']
})
export class ProductComponent implements OnInit {

  // 声明一个流,负责接收服务器上传过来的流
  dataSource:Observable<any>;

  // 用来和模版做数据绑定的数组
  products:Array<any> = [];

  clonedProducts: { [s: string]: Product; } = {};

  productForm: FormGroup;

  callTimes: number = 0;

  cols: any[];

  product: Product;

  newProduct: boolean;

  displayDialog: boolean;

  // 将angular的服务依赖注入进来
  constructor(private http:HttpClient, private fb: FormBuilder, private messageService: MessageService) {
   }

  ngOnInit() {
    this.productForm = this.fb.group({
      title: [null,Validators.required],
      price: [null,Validators.required],
      rating: [null,Validators.required],
      desc: [null,[Validators.required, Validators.maxLength(10)]]
    })
    // this.productForm = new FormGroup({
    //   title: new FormControl(null,Validators.required),
    //   price: new FormControl(null,Validators.required),
    //   rating: new FormControl(null,Validators.required),
    //   desc: new FormControl(null,[Validators.required, Validators.maxLength(10)])
    // })

    this.getProducts();

    this.cols = [
      { field: 'title', header: 'Title' },
      { field: 'price', header: 'Price' },
      { field: 'rating', header: 'Rating' },
      { field: 'desc', header: 'Description' }
    ];
  }

  getProducts() {
    this.callTimes += 1;

    const startTime : number = new Date().getTime();

    this.http.get('api/products')
    .subscribe(data => { this.products = <any>data; });

    const endTime : number = new Date().getTime();

    console.log("Get Products cost " + (endTime - startTime) + " Milliseconds");
    console.log("Get Products Call Times: " + this.callTimes);
  }

  getProduct(id: number) {
    return this.products.find(p => p.id == id);
  }

  saveProduct(product: Product){
    let productJSON = JSON.stringify(product);
    console.log("save Product " + productJSON);

    const httpOptions = {
      headers: new HttpHeaders({
        'Content-Type': 'application/json'
      })
    };

    this.http.post('/api/product', productJSON, httpOptions)
    .subscribe(
      (val) => {
        console.log("POST call successful value returned in body: ", val);
        this.getProducts();
      },  
      err => {  
        console.log("POST call in error", err);  
      },  
      () => {  
        console.log("The POST observable is now completed.");  
      }  
    );
  }

  deleteProduct(product: Product){
    let productJSON = JSON.stringify(product);

    console.log("delete Product " + productJSON);
    this.http.delete('/api/product/' + productJSON)
    .subscribe(
      (val) => {
        console.log("DELETE call successful value returned in body: ", val);
        this.getProducts();
      },
      err => {
        console.log("DELETE call in error", err);
      },
      () => {
        console.log("The DELETE observable is now completed.");
      }
    );
  }

  updateProduct(product:Product){
    console.log("update Product " + JSON.stringify(product));
    this.http.put('/api/product/', product)
    .subscribe(
      (val) => {
        console.log("UPDATE call successful value returned in body: ", val);
        this.getProducts();
      },
      err => {
        console.log("UPDATE call in error", err);
      },
      () => {
        console.log("The UPDATE observable is now completed.");
      }
    );
  }

  saveProductByForm(){
    this.saveProduct(this.productForm.value);
  }

  saveorUpdateProductByPrimeNG(){
    if(this.newProduct){
      this.saveProduct(this.product);
    }else {
      this.updateProduct(this.product);
    }

    this.product = null;
    this.displayDialog = false;
  }
  
  deleteProductByPrimeNG(){
    if(!this.newProduct){
      this.deleteProduct(this.product);
    }

    this.product = null;
    this.displayDialog = false;
  }

  onRowEditInit(product:Product){
    this.clonedProducts[product.id] = {...product};
    console.log("onRowEditInit " + product.id);
  }

  onRowEditSave(product:Product){
    console.log("onRowEditSave " + product.id);
    if (product.price > 0 && product.rating > 0) {
      this.updateProduct(product);
      delete this.clonedProducts[product.id];
      this.messageService.add({severity:'success', summary: 'Success', detail:'Product is updated'});
    }else{
      this.messageService.add({severity:'error', summary: 'Error', detail:'Price or Rating is invalidated'});
      this.getProducts();
    }
  }

  onRowEditCancel(product:Product, index: number){
    this.products[index] = this.clonedProducts[product.id];
    delete this.clonedProducts[product.id];

    console.log("onRowEditCancel " + product.id);
    console.log("onRowEditCancel ri: " + index);
  }

  showDialogToAdd() {
    this.newProduct = true;
    this.product = new Product();
    this.displayDialog = true;
  }

  onRowSelect(event) {
    this.newProduct = false;
    this.product = this.cloneProduct(event.data);
    this.displayDialog = true;
  }

  cloneProduct(p: Product): Product {
    let product = new Product();
    for (let prop in p) {
      product[prop] = p[prop];
    }
    return product;
  }
}
product.component.html angular, nodejs, redis
<!-- <form (ngSubmit)='saveProductByForm()' [formGroup]='productForm' novalidate class="form">
  <input formControlName='title' type="text" class="form-control" placeholder="Enter Product Title"/>
  <div class="alert alert-danger" *ngIf="productForm.get('title').hasError('required') && productForm.get('title').touched">
    Product Title is required 
  </div>
  <input formControlName='price' type="number" class="form-control" placeholder="Enter Product Price"/>
  <div class="alert alert-danger" *ngIf="productForm.get('price').hasError('required') && productForm.get('price').touched">
      Product Price is required 
  </div>
  <input formControlName='rating' type="number" class="form-control" placeholder="Enter Product Rating"/>
  <input formControlName='desc' type="text" class="form-control" placeholder="Enter Product Description"/>
  <div class="alert alert-danger" *ngIf=" !productForm.get('desc').valid && productForm.get('desc').touched">
      Product Description is required and should less than 10 characters
  </div>
  <button [disabled]='productForm.invalid' class="btn btn-default">Save Product</button>
</form>
 
<br/> -->

<!--
<table class="table table-striped table-bordered">
  <thead>
    <tr>
      <th>Index</th>
      <th>Title</th>
      <th>Price</th>
      <th>Rating</th>
      <th>Description</th>
      <th>Actions</th>
    </tr>
  </thead>
  <tbody>
    <tr *ngFor="let product of products; let i = index">
      <td>{{ i + 1 }}</td>
      <td>{{ product.title }}</td>
      <td>{{ product.price }}</td>
      <td>{{ product.rating }}</td>
      <td>{{ product.desc }}</td>
      <td><button class="btn btn-default" (click)="updateProduct(product)">Update</button>
          <button class="btn btn-default" (click)="deleteProduct(product)">Delete</button>
      </td>
    </tr>
  </tbody>
</table>
-->


<!-- <div class="content-section implementation">
    <p-toast [style]="{marginTop: '80px'}"></p-toast>

    <p-table [value]="products" dataKey="title" editMode="row">
        <ng-template pTemplate="header">
            <tr>
                <th>Title</th>
                <th>Price</th>
                <th>Rating</th>
                <th>Description</th>
                <th style="width:12em"></th>
            </tr>
        </ng-template>
        <ng-template pTemplate="body" let-rowData let-editing="editing" let-ri="rowIndex">
            <tr [pEditableRow]="rowData">
                <td>
                    {{rowData.title}}
                </td>
                <td>
                    <p-cellEditor>
                        <ng-template pTemplate="input">
                            <input pInputText type="text" [(ngModel)]="rowData.price" required [ngStyle]="{'width':'100%'}">
                        </ng-template>
                        <ng-template pTemplate="output">
                            {{rowData.price}}
                        </ng-template>
                    </p-cellEditor>
                </td>
                <td>
                    <p-cellEditor>
                        <ng-template pTemplate="input">
                            <p-dropdown [options]="brands" [(ngModel)]="rowData.rating" [style]="{'width':'100%'}"></p-dropdown>
                            <input pInputText type="text" [(ngModel)]="rowData.rating" required [ngStyle]="{'width':'100%'}">
                        </ng-template>
                        <ng-template pTemplate="output">
                            {{rowData.rating}}
                        </ng-template>
                    </p-cellEditor>
                </td>
                <td>
                    <p-cellEditor>
                        <ng-template pTemplate="input">
                            <input pInputText type="text" [(ngModel)]="rowData.desc" [ngStyle]="{'width':'100%'}">
                        </ng-template>
                        <ng-template pTemplate="output">
                            {{rowData.desc}}
                        </ng-template>
                    </p-cellEditor>
                </td>
                <td style="text-align:center">
                    <button *ngIf="!editing" pButton type="button" pInitEditableRow icon="pi pi-pencil" class="ui-button-info" (click)="onRowEditInit(rowData)"></button>
                    <button *ngIf="editing" pButton type="button" pSaveEditableRow icon="pi pi-check" class="ui-button-success" style="margin-right: .5em" (click)="onRowEditSave(rowData)"></button>
                    <button *ngIf="editing" pButton type="button" pCancelEditableRow icon="pi pi-times" class="ui-button-danger" (click)="onRowEditCancel(rowData, ri)"></button>
                    <button type="button" pButton icon="pi pi-times" (click)="deleteProduct(rowData)" style="margin-left: .5em"></button>
                </td>
            </tr>
        </ng-template>
    </p-table>
</div> -->


<p-table [columns]="cols" [value]="products" selectionMode="single" [(selection)]="selectedCar" (onRowSelect)="onRowSelect($event)" [paginator]="true" [rows]="15">
    <ng-template pTemplate="caption">
        List of Products
    </ng-template>
    <ng-template pTemplate="header" let-columns>
        <tr>
            <th *ngFor="let col of columns" [pSortableColumn]="col.field">
                {{col.header}}
                <p-sortIcon [field]="col.field"></p-sortIcon>
            </th>
        </tr>
    </ng-template>
    <ng-template pTemplate="body" let-rowData let-columns="columns">
        <tr [pSelectableRow]="rowData">
            <td *ngFor="let col of columns">
                {{rowData[col.field]}}
            </td>
        </tr>
    </ng-template>
    <ng-template pTemplate="summary" let-rowData>
        <div style="text-align:left">
            <button type="button" pButton icon="fa fa-plus" (click)="showDialogToAdd()" label="Add"></button>
        </div>
    </ng-template>    
</p-table>

<p-dialog header="Product Details" [(visible)]="displayDialog" [responsive]="true" showEffect="fade" [modal]="true"  [style]="{width: '300px'}">
    <div class="ui-g ui-fluid" *ngIf="product">
        <div class="ui-g-12">
            <div class="ui-g-4">
                <label for="title">Title</label>
            </div>
            <div class="ui-g-8">
                <input pInputText id="title" [(ngModel)]="product.title" />
            </div>
        </div>
        <div class="ui-g-12">
            <div class="ui-g-4">
                <label for="price">Price</label>
            </div>
            <div class="ui-g-8">
                <input pInputText id="price" [(ngModel)]="product.price" />
            </div>
        </div>
        <div class="ui-g-12">
            <div class="ui-g-4">
                <label for="rating">Rating</label>
            </div>
            <div class="ui-g-8">
                <input pInputText id="rating" [(ngModel)]="product.rating" />
            </div>
        </div>
        <div class="ui-g-12">
            <div class="ui-g-4">
                <label for="desc">Description</label>
            </div>
            <div class="ui-g-8">
                <input pInputText id="desc" [(ngModel)]="product.desc" />
            </div>
        </div>
    </div>
    <p-footer>
        <div class="ui-dialog-buttonpane ui-helper-clearfix">
            <button type="button" pButton icon="fa fa-close" (click)="deleteProductByPrimeNG()" label="Delete"></button>
            <button type="button" pButton icon="fa fa-check" (click)="saveorUpdateProductByPrimeNG()" label="Save"></button>
        </div>
    </p-footer>
</p-dialog>
setup-logger middleware nodejs
# package.json
{
	  "name": "setup-logger middleware"
	, "version": "0.0.1"
	, "description": "Setup-logger middleware connect website!"
	, "dependencies": {
			"connect": "3.3.3"
			, "serve-static": "1.12.1"
		}
}

# setupLogger.js
/*
// Arror function involve by ECMAScript 6, support since node version v4.3.2, node -v to check node version
function setupLogger (format){
	const regexp = /:(\w+)/g;
	
	return function createLogger(req, res, next){
			const str = format.replace(regexp, (match, property) => {
				return req[property];
			});
			console.log(str);
			next();
	}
}
*/

// Old-school
function setupLogger (format){
	const regexp = /:(\w+)/g;
	/*
	return function createLogger(req, res, next){
			const str = format.replace(regexp, function(match, property){
//(精确的参数个数依赖于replace()的第一个参数是否是一个正则表达式对象, 以及这个正则表达式中指定了多少个括号子串。) source from: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace

				//console.log('req is --- %s', req);
				console.log('arguments[0] is match--- %s', arguments[0]);
				console.log('arguments[1] is 1st brackets() sub string in regexp--- %s', arguments[1]);
				//if exist more brackets() sub string in regexp, then arguments[2] is 2nd brackets() sub string, arguments[3] is 3rd brackets() sub string and so on...

				console.log('arguments[2] is offset--- %s', arguments[2]);
				console.log('arguments[3] is string--- %s', arguments[3]);
				console.log('arguments[4] is undefined--- %s', arguments[4]);
				console.log('arguments[5] is undefined--- %s', arguments[5]);
				console.log('arguments[6] is undefined--- %s', arguments[6]);
				
				console.log('match is --- %s', match);
				console.log('property is --- %s', property);
				console.log('req[property] is --- %s', req[property]);
				return req[property];
			});
			console.log(str);
			next();
	}
	*/
	return function createLogger(req, res, next){
		const str = format.replace(regexp, function(match, property){
				//return req[arguments[1]];
				return req[property];
			});
			console.log(str);
			next();
	}
}

module.exports = setupLogger;


# server.js
const connect = require('connect')
		, logger = require('./setupLogger');

function hello(req, res){
	res.setHeader('Content-Type', 'text/plain');
	res.end('Hello World');
}

const app = connect()
	.use(logger(':method :url'))
	.use(hello)
	.listen(3000);
website-files-upload nodejs
# package.json
{
	"name": "files-upload",
	"version": "0.0.1",
	"description": "A files upload website",
	"dependencies": {
		"connect": "3.6.6",
		"formidable": "1.2.1",
		"serve-static": "1.13.2"
	}
}



# index.html
<form action="/" method="POST" enctype="multipart/form-data">
	<input type="file" name="file1" />
	<input type="file" name="file2" />
	<button>Send files!</button>
</form>

# server.js
var connect = require('connect')
    ,serveStatic = require('serve-static')
    ,formidable = require('formidable')
    ,fs = require('fs');
            
var server = connect();
server.use(serveStatic(__dirname + '/website'));    
  
  
server.use(function (req, res, next){
	if('POST' == req.method){
		var form = new formidable.IncomingForm();

		form.parse(req, function(err, fields, files) {
			res.writeHead(200, {'content-type': 'text/html'});
			res.end(resUploadFile(files));
    });  
	}else {
		next();    
	}    
});  
    
server.listen(3000);

function resUploadFile(files){
	var resHtml = '';
	
	for (var fileName in files){
		var file = files[fileName];
		
		//use readFileSync replace readFile to make sure can get file data
		var fileData = fs.readFileSync(file.path);

		console.log('File: %s', file.name);
		console.log('Contents: %s', fileData);
			
		resHtml += [
						'<h2>Received upload:</h2>\n\n'
					,	'<h3>File:' + file.name + '</h3>\n\n'
					,	'<h4>Type:' + file.type + '</h4>\n\n'
					,	'<h4>Contents:\n' + fileData + '</h4>\n\n'
					, '------------------------------------\n'
				].join('');
	}
	
	return resHtml;
}
require-time middleware nodejs
# package.json
{
	  "name": "require-time"
	, "version": "0.0.1"
	, "description": "A require time middleware"
	, "dependecies": {
			"connect": "3.3.3"
			,"morgan": "1.9.1"  
		}
}

/**
request-time.js
*/
module.exports = function(opts) {
  var time = opts.time || 100;
  return function(req, res, next) {
    var timer = setTimeout(function() {
      console.log('\033[90m%s %s\033[91m is taking too long! \033[39m', req.method, req.url);
    }, time);
 
    var end = res.end;
    res.end = function(chunk, encoding) {
      res.end = end;
      res.end(chunk, encoding);
      clearTimeout(timer);
    };
    next();
  };
};

/**
server.js
*/
var connect = require('connect'),
  time = require('./request-time'),
  logger = require('morgan');  
 
var server = connect();
 
server.use(logger('dev')); 
server.use(time({time: 500}));
 
server.use(function(req, res,next) {
  if ('/a' == req.url) {
    res.writeHead(200);
    res.end('Fast!');
  } else {
    next();
  }
});
 
server.use(function(req, res,next) {
  if ('/b' == req.url) {
    setTimeout(function() {
      res.writeHead(200);
      res.end('Slow');
    }, 1000);
  } else  {
    next();
  }
});
 
server.listen(3000);
Connect module - serve-static nodejs
# package.json
{
        "name": "connect-website1",
        "version": "0.0.1",
        "description": "The first connect website!",
        "dependencies": {
                "connect": "3.3.3",
                "serve-static": "1.12.1",
                "morgan": "1.9.1"
        }
}

# server.js
var connect = require('connect'),  
	serveStatic = require('serve-static'),
	logger = require('morgan');
  
var server = connect();  
server.use(serveStatic(__dirname + '/website'));  
server.listen(3000);  

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

# index.html
<h1>My website</h1>

<img src="/images/1.jpg">

# refer URL
https://stackoverflow.com/questions/28830902/nodejs-webserver-undefined-is-not-a-function
fs - readfile nodejs
#package.json
{
	  "name": "file-explorer"
	, "version": "0.0.1"
	, "description": "A command-file file explorer!"
}

#index.js
/*
* Module dependencies.
*/

var fs = require('fs')
	, stdin = process.stdin
	, stdout = process.stdout
	, stats = [];

/*
fs.readdir(__dirname, function (err, files){
	console.log(files);
})
*/

fs.readdir(process.cwd(), function (err, files) {
	console.log('');
	
	if (!files.length) {
		return console.log('    \033[31m No files to show!\033[39m\n');
	}
	
	console.log(' Select which file or directory you want to see\n');
	
	//called for each file walked in the directory
	function file(i) {
		var filename = files[i];
		
		fs.stat(__dirname + '/' + filename, function (err, stat) {
			stats[i] = stat;
			if (stat.isDirectory()){
				console.log('    '+i+'   \033[36m' + filename + '/\033[39m');
			} else {
				console.log('    '+i+'   \033[90m' + filename + '\033[39m');
			}
			
			i++;
			
			if (i == files.length) {
				read();
			} else {
				file (i);
			}

		});
	}
	
	//read user input when files are shown
	function read () {
		console.log('');
		stdout.write('    \033[33m Enter your choice: \033[39m');
		stdin.resume();
		stdin.setEncoding('utf8');
		stdin.on('data', option);
	}
	
	//called with the option supplied by the user
	function option (data) {
		var filename = files[Number(data)];
//		if (!filename){
//			stdout.write('    \033[31m Enter your choice: \033[39m');
		if (stats[Number(data)].isDirectory()){
			fs.readdir(__dirname + '/' + filename, function (err, files) {
				console.log('');
				console.log('    (' + files.length + ' files)');
				files.forEach(function (file) {
					console.log('    -  ' + file);
				});
				console.log('');
			});
		} else {
			stdin.pause();
			fs.readFile(__dirname + '/' + filename, 'utf8', function (err, data){
				
				console.log('');
				console.log('\033[90m' + data.replace(/(.*)/g, '    $1') + '\033[39m');
			});
		}
	}
	
	file(0);
});


	
Global site tag (gtag.js) - Google Analytics