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);
});
|