篮球外围下注_篮球投注导航_[所有网址]

篮球外围下注_篮球投注导航_[所有网址]是该公司为打造信誉第一,2014最新体验金,篮球外围下注_篮球投注导航_[所有网址]这里的所有老虎机游戏及真人百家乐游戏都具有欧洲风格,致力成为最具传播力和互动性的娱乐城网站。

node

2019-07-31 19:48 来源:未知

您可能感兴趣的文章:

  • Node.js利用console输出日志文件的方法示例
  • Node.js利用debug模块打印出调试日志的方法
  • Node.js 日志处理模块log4js
  • Node.js与Sails ~项目结构与Mvc实现及日志机制
  • Node.js和MongoDB实现简单日志分析系统
  • Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)

运行起基于express的web服务器

express是一个web应用开发框架,它基于nodejs,扩展了很多web开发所需的功能,使得我们能够很方便的访问和操作request和response。请注意它和nginx或者tomcat并不是一个概念,它是一个开发框架,而不是服务器。

运行起基于express的web服务器是非常简单的,因为express都绑你封装好了。首先需要用npm安装好express,然后在项目根目录下新建一个server.js文件,内容如下:

JavaScript

var express = require('express'); var app = express(); app.listen(3000); var _rootDir = __dirname; var protectDir = _rootDir '/protect/'; app.use(express.static(_rootDir)); //注册路由 app.get('/', function(req, res){ res.sendFile(_rootDir '/src/index.html'); }); app.use(function(req, res, next) { res.status(404).sendFile(_rootDir '/src/404.html'); }); app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('500 Error'); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var express = require('express');
var app = express();
app.listen(3000);
 
var _rootDir = __dirname;
var protectDir = _rootDir '/protect/';
 
app.use(express.static(_rootDir));
 
//注册路由
app.get('/', function(req, res){
    res.sendFile(_rootDir '/src/index.html');
});
 
app.use(function(req, res, next) {
     res.status(404).sendFile(_rootDir '/src/404.html');
});
app.use(function(err, req, res, next) {
     console.error(err.stack);
     res.status(500).send('500 Error');
});

上述代码实现了这几个功能,首先创建了http服务器,监听在3000端口。

然后app.use(express.static(_rootDir));这一行是使用了静态文件服务的中间件,这样我们项目下的js、css以及图片等静态文件就都可以访问到了。

接下来是注册路由,此处只匹配一个路由规则,那就是”/”(网站的根目录),当匹配到此路由后把首页文件index.html直接用res.sendFile方法给发送到浏览器端。这样浏览器用

但是在本项目中,我们用的是angular的前端模板,所以后端就不需要模板了,没有进行配置。我们的路由机制也是完全使用的ng的前端路由,所以在express中只配置一条就够了。

在最后还有两块代码,分别是404和500错误的捕获。你可能会疑惑为什么是这样写呢?从上到下排下来就能分别捕获404和500了吗?其实这就是express的中间件机制,在此机制下,对客户端请求的处理像是一个流水线,把所有中间件串联起来,只要某个中间件把请求返回了,就结束执行,否则就从上到下一直处理此请求。

上面代码的流程就是,先按路由规则来匹配路径,如果路由匹配不到,则认为是发生404。500的错误请注意一个细节,在回调函数的参数中,第一个会传入err,就是错误对象,以此来标记是一个500错误。

node.js中JavaScript 文件名命名规则

  • 不要用中文
  • 不要包含空格
  • 不要出现node关键字
  • 建议以 '-' 分割单词

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

用“MVC”组织代码

用MVC的结构组织代码当然是黄金法则了。express可以用模板引擎来渲染view层,路由机制来组织controller层,但是express并没有明确规定MVC结构应该怎样写,而是把自由选择交给你,自己来组织MVC结构。当然你也可以组织别的形式,比如像Java中的“n层架构”。

在本项目中,我们就以文件夹的形式来简单组织一下。因为我们使用了前端模板,所以后端的view层就不存在了,只有controller和model。看一下项目的目录:

图片 1

在protect下有两个文件夹controllers和models分别放C和M。我们路由中使用的questionController对象就定义在questionController.js中,来看一下用于保存试题的save方法是如何定义的:

JavaScript

var Question = require('../models/question'); module.exports = { //添加试题 save: function(req, res){ var data = req.body.question; Question.save(data, function(err, data){ if(err){ res.send({success: false, error: err}); } else{ res.send({success: true, data: data}); } }); } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var Question = require('../models/question');
module.exports = {
     //添加试题
     save: function(req, res){
          var data = req.body.question;
          Question.save(data, function(err, data){
               if(err){
          res.send({success: false, error: err});
     }
     else{
          res.send({success: true, data: data});
     }
          });
     }
}

questionController作为一个模块,使用标准的commonjs语法,我们定义了save方法,通过req.body.question,可以拿到前台传过来的数据。在这个模块中,我们require了位于model层的Question模型,没错,它就是用来操作数据库的,调用Question.save方法,这份数据就存入了数据库,然后在回调函数中,我们用res.send将json数据返回给前端。

定义好questionController后,我们就可以在server.js中把它给require进去了,然后就有了之前我们在路由中使用的

JavaScript

apiRouter.post('/submitQuestion', questionController.save);

1
apiRouter.post('/submitQuestion', questionController.save);

整个流程就串通起来了。

models文件夹中放的就是模型了,用来管理与数据库的映射和交互,这里使用了mongoose作为数据库的操作工具,model层如何来编写,本篇就不做介绍了,在下一篇中我们再详细讲解。

最后再声明一下,本篇文章的代码是基于一个练习项目QuestionMaker,为了更好理解文章中的叙述,请查看项目的源码:

1 赞 2 收藏 评论

图片 2

express.static(root,[options])

  • root 参数指的是静态资源文件所在的根目录,写绝对路径。

  • options 对象是可选的(http://www.expressjs.com.cn/4x/api.html)

代码如下

用“MEAN”技术栈开发web应用(二)express搭建服务端框架

2015/11/14 · 基础技术 · MEAN

原文出处: 吕大豹   

上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据。本篇我们来介绍一下,如何在nodejs环境下利用express来搭建起服务端,使之正确的响应前端的请求。本文所讲的示例还是基于我们的学习项目QuestionMaker()

浏览器访问网站过程

  1. 在浏览器地址栏中输入网址

  2. 浏览器通过用户在地址栏中输入的URL构建HTTP请求报文。

  3. 浏览器发起DNS解析请求,将域名转换为IP地址。

  4. 浏览器将请求报文发送给服务器。

  5. 服务器接收请求报文,并解析。

  6. 服务器处理用户请求,并将处理结果封装成HTTP响应报文。

  7. 服务器将HTTP响应报文发送给浏览器。

  8. 浏览器接收服务器响应的HTTP报文,并解析。

  9. 浏览器解析 HTML 页面并展示,在解析HTML页面时遇到新的资源需要再次发起请求。

  10. 最终浏览器展示出了页面

var end = res.end;
res.end = function(chunk, encoding) {
 res.responseTime = (new Date) - req._startTime;
 res.end = end;
 res.end(chunk, encoding);
 ...
 }

路由设计

运行起了服务器,了解了中间件编程方式,接下来我们就该为前端提供api了。比如前端post一个请求到/api/submitQuestion来提交一份数据,我们该如何接收请求并做出处理呢,这就是路由的设计了。

给app.use的第一个参数传入路径可以匹配到对应的请求,例如:

JavaScript

app.use('/api/submitQuestion', function(){})

1
app.use('/api/submitQuestion', function(){})

这样就可以捕获到刚刚的提交试题的请求,在第二个参数中可以进行相应的处理,比如把数据插入到数据库。

但是,要注意了,express路由的正确使用姿势并不是这样的。app.use是用来匹配中间件的路径的,而不是请求的路径。因为路由也是一种中间件,所以这样的用法也是能够完成功能的,但是我们还是应该按照官方标准的写法来写。

标准的写法是什么样子呢?代码如下:

JavaScript

var apiRouter = express.Router(); apiRouter.post('/submitQuestion', questionController.save); app.use('/api', apiRouter);

1
2
3
var apiRouter = express.Router();
apiRouter.post('/submitQuestion', questionController.save);
app.use('/api', apiRouter);

我们利用的是express.Router这个对象,它同样有use、post、get等方法,用来匹配请求路径。然后我们再使用app.use把apiRouter作为第二个参数传进去。

要注意的是apiRouter.post和app.use的第一个参数。app.use匹配的是请求的“根路径”,这样可以把请求分为不同的类别,比如所有的异步接口我们都叫api,那么这类请求我们就都应该挂在“/api”下。按照这样的规则,我们整个项目的路由规则如下:

JavaScript

//注册路由 app.get('/', function(req, res){ res.sendFile(_rootDir '/src/index.html'); }); var apiRouter = express.Router(); apiRouter.post('/getQuestion', questionController.getQuestion); apiRouter.post('/getQuestions', questionController.getQuestions); apiRouter.post('/submitQuestion', questionController.save); apiRouter.post('/updateQuestion', questionController.update); apiRouter.post('/removeQuestion', questionController.remove); apiRouter.post('/getPapers', paperController.getPapers); apiRouter.post('/getPaper', paperController.getPaper); apiRouter.post('/getPaperQuestions', paperController.getPaperQuestions); apiRouter.post('/submitPaper', paperController.save); apiRouter.post('/updatePaper', paperController.update); apiRouter.post('/removePaper', paperController.remove); app.use('/api', apiRouter);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//注册路由
app.get('/', function(req, res){
    res.sendFile(_rootDir '/src/index.html');
});
 
var apiRouter = express.Router();
apiRouter.post('/getQuestion', questionController.getQuestion);
apiRouter.post('/getQuestions', questionController.getQuestions);
apiRouter.post('/submitQuestion', questionController.save);
apiRouter.post('/updateQuestion', questionController.update);
apiRouter.post('/removeQuestion', questionController.remove);
apiRouter.post('/getPapers', paperController.getPapers);
apiRouter.post('/getPaper', paperController.getPaper);
apiRouter.post('/getPaperQuestions', paperController.getPaperQuestions);
apiRouter.post('/submitPaper', paperController.save);
apiRouter.post('/updatePaper', paperController.update);
apiRouter.post('/removePaper', paperController.remove);
 
app.use('/api', apiRouter);

在router的第二个参数中,我们传入了questionController.save这样的方法,这是什么东西呢?怎么有点MVC的味道呢?没错,我们已经能够匹配到路由了,那服务端的业务逻辑以及数据库访问等该如何组织代码呢?

路由对象

// router.js文件中
var express = require("express")
var router = express.Router();

router.get()
router.use()

// app.js文件中
var app = express();
app.use(router);

express-winston 没有修改或者扩展 winston 的transport, 而 winston-daily-rotate-file 正是增强了 winston 的transport 办法

理解中间件

express的核心是中间件机制,通过使用各种中间件,能够实现灵活的组装我们所需的功能。中间件是在管道中执行的,所谓管道就是像流水线一样,每到达一个加工区,相应的中间件就可以处理request和response对象,处理完后再送往下一个加工区。如果某个加工区把请求终结了,比如调用send方法返回给了客户端,那么处理就终止了。大部分情况下,都有现成的中间件供我们使用,比如用body-parser解析请求实体,用路由(路由也是一种中间件)来正确的派发请求。

比如我们在server.js中添加如下的代码:

JavaScript

app.use(function(req, res, next){ console.log('中间件1'); next(); }); app.use(function(req, res, next){ console.log('中间件2'); });

1
2
3
4
5
6
7
8
app.use(function(req, res, next){
     console.log('中间件1');
     next();
});
 
app.use(function(req, res, next){
     console.log('中间件2');
});

我们添加了两个中间件,请求过来之后会先被第一个捕获,然后进行处理,输出“中间件1”。后面接着执行了next()方法,就会进入下一个中间件。一个中间件执行后只有两种选择,要么用next指向下一个中间件,要么将请求返回。如果什么都不做,请求将会被挂起,也就是说浏览器端将得不到返回,一直处于pendding状态。例如上面的中间件2,将会造成请求挂起,这是应该杜绝的。

REPL环境

  1. REPL 全称: Read-Eval-Print-Loop(交互式解释器)
  • R 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
  • E 执行 - 执行输入的数据结构
  • P 打印 - 输出结果
  • L 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c、.exit或者process.exit() 按钮退出。
  1. 在REPL中编写程序 (类似于浏览器开发人员工具中的控制台功能)
  • 直接在控制台输入 node 命令进入 REPL 环境
  1. 按两次 Control C 退出REPL界面 或者 输入 .exit 退出 REPL 界面
  • 按住 control 键不要放开, 然后按两下 c 键

代码片段

获取post请求发送的数据

如果post传过来的数据时大量的话,那么data事件可能会触发多次,所以可声明一个空数组,用来存放每次触发data事件的时候传过来的一段数据,end事件是当数据全部传送完毕的时候会调用的函数,这个时候再把数组中每一次传过来的数据拼接起来,就得到了完整的数据。

server.on("request", function(req, res){
    var chunkArr = [];  // 用来保存post请求传过来的数据
    req.on("data", function(chunk){
        chunkArr.push(chunk);  // 将此次数据存放起来
    })

    req.on("end", function(){
        // 拼接全部数据
        var result = Buffer.concat(chunkArr);
    })
})

是 express-winston 的 winston 的增加版, 是作为 express 的中间件来打印日志,不仅有请求头信息,并且有响应时间。
作为中间件, 为什么会有响应时间呢? 因为 express-winston 改写了 express 的 res.end 办法, 是请求结束后再打的日志。

fs模块--文件的读写

var fs = require("fs"); // 引用fs模块
// 写
fs.writeFile("文件路径", "要写的内容", "编码格式", function(err){
    if(err){
        throw err;
    }
    console.log("写入成功")
})
// 读
fs.readFile("文件路径", function(err, data){
    //data是一个Buffer 字节数组
    //获取字符串,需要自己toString
})
// 读
fs.readFile("文件路径", "utf-8", function(err, data){
    //data是一个字符串
})

// 创建一个目录
fs.mkdir('./test-mkdir',function(err){
    if(err){
        console.log("创建文件夹出错");
        console.log(err)
    }else{
        console.log("创建成功")
    }
})

express-winston

牢记以下三点

  1. 请求,客户端发起请求。
  2. 处理,服务器处理请求。
  3. 响应,服务器将处理结果发送给客户端

在使用 nodejs winston 模块中,加上相关的两个模块,事倍功半。

node.js命令

  1. 该日志中间件应该在调用链 api 后面, api/* 业务处理之前。 like: app.use('/api', apiRequestLogger, apiHandler)
  2. 要获取到响应数据, 就要在业务处理完后 send 出来后才能捕获到,express 所有的请求响应最后都是走 res.send 我们可以从这里入手捕获响应数据

node.js 是什么?

  1. node.js 是一个开发平台,就像Java开发平台、.Net开发平台、PHP开发平台、Apple开发平台一样。
  • 何为开发平台?有对应的编程语言、有语言运行时、有能实现特定功能的API(SDK:Software Development Kit)
  1. 该平台使用的编程语言是 JavaScript 语言。
  2. node.js 平台是基于 Chrome V8 JavaScript 引擎构建。
  3. 基于 node.js 可以开发控制台程序(命令行程序、CLI程序)、桌面应用程序(GUI)(借助 node-webkit、electron 等框架实现)、Web 应用程序(网站)

PHP开发技术栈: LAMP - Linux Apache MySQL PHP

node.js 全栈开发技术栈: MEAN - MongoDB Express Angular Node.js

结合使用

浏览器工作原理

winston-daily-rotate-file 是 winston 扩展, 增加了 transport 的办法,使 winston 有滚动日志的能力。

node.js 有哪些特点?

  1. 事件驱动(当事件被触发时,执行传递过去的回调函数)
  2. 非阻塞 I/O 模型(当执行I/O操作时,不会阻塞线程)
  3. 单线程
  4. 拥有世界最大的开源库生态系统 —— npm。
  1. express-winston
  2. winston-daily-rotate-file

主流渲染引擎

import winston from 'winston'
import expressWinston from 'express-winston'
import 'winston-daily-rotate-file'
import path from 'path'

export let DailyRotateFileTransport = (fileName) => {
 return new (winston.transports.DailyRotateFile)({
 filename: path.join(process.env.LOGPATH, `${fileName}- 
TAG标签: 篮球外围下注
版权声明:本文由篮球外围下注发布于系统,转载请注明出处:node