my-blog icon indicating copy to clipboard operation
my-blog copied to clipboard

:book:My blog

Results 65 my-blog issues
Sort by recently updated
recently updated
newest added

众所周知,Node.js中的JavaScript代码执行在单线程中,非常脆弱,一旦出现了未捕获的异常,那么整个应用就会崩溃。这在许多场景下,尤其是web应用中,是无法忍受的。通常的解决方案,便是使用Node.js中自带的cluster模块,以master-worker模式启动多个应用实例。然而大家在享受cluster模块带来的福祉的同时,不少人也开始好奇: 1. 为什么我的应用代码中明明有`app.listen(port);`,但cluter模块在多次`fork`这份代码时,却没有报端口已被占用? 2. Master是如何将接收的请求传递至worker中进行处理然后响应的? 让我们从Node.js项目的`lib/cluster.js`中的代码里,来一勘究竟。 ## 问题一 为了得到这个问题的解答,我们先从worker进程的初始化看起,master进程在`fork`工作进程时,会为其附上环境变量`NODE_UNIQUE_ID`,是一个从零开始的递增数: ``` js // lib/cluster.js // ... function createWorkerProcess(id, env) { // ... workerEnv.NODE_UNIQUE_ID = '' + id; // ... return fork(cluster.settings.exec,...

Blog

## 前言 项目 github 地址:https://github.com/DavidCai1993/ES6-benchmark 如果有想要增加的特性 benchmark ,欢迎更新`benchmarks/` ,然后 PR 。 ## 环境 - CPU: Intel Core(TM) i5-2410M 2.30GHz - Memory: 8GB 1600 MHz DDR3 - Node.js: 5.9.0 / Node-chakracore...

Blog

## 前言 本文将会从最基本的一种web权限验证说起,即HTTP Basic authentication,然后是基于cookies和tokens的权限验证,最后则是signatures和一次性密码。 ## HTTP Basic authentication 当客户端发起一个请求时,它可以使用HTTP Basic authentication来提供一个用户名和密码,来进行权限验证。 由于它不依赖于cookies,sessions等任何外部因素,所以它是最简单的权限验证方法。在使用它时,客户端需要在每次请求时,都附带上`Authorization`请求头,用户名和密码都不会被加密,但是需要被格式化为以下结构: - 用户名和密码由一个冒号连接,如`username:password` - 这个字符串需进行Base64编码 - `Basic`关键字需被放置在这个编码后的字符串的前面 例子: ``` SHELL curl --header "Authorization: Basic am9objpzZWNyZXQ=" my-website.com ``` 在`Node.js`中实现它是非常简单的,以下是一个通过`Express`中间件来实现的例子:...

Blog

title: '[译]Express在生产环境下的最佳实践-性能和可靠性' date: 2015-11-21 18:29:31 tags: - Node.js - Express ## - 译文 ## 前言 这将是一个分为两部分,内容是关于在生产环境下,跑`Express`应用的最佳实践。第一部分会关注安全性,第二部分则会关注性能和可靠性。当你读这篇文章时,会假设你已经对`Node.js`和web开发有所了解,并且对生产环境有了概念。 关于第一部分,请参阅[Express在生产环境下的最佳实践 - 安全性](http://segmentfault.com/a/1190000003996618)。 ## 概览 正如第一部分所说,生产环境是供你的最终用户们所使用的,而开发环境则是供你开发和测试代码所用。故对于和两个环境的要求,是非常不同的。例如,在开发环境下,你不必考虑伸缩性和可靠性还有性能的问题,但这些在生产环境下都非常重要。 接下来,我们会将此文分为两大部分: - 需要对代码做的事,即开发部分。 - 需要对环境做的事,即运维部分, ## 需要对代码做的事 为了提升你应用的性能,你可以通过:...

Blog

## 前言 `Node`和`Express`并不严格要求它的应用的文件结构。你可以以任意的结构来阻止你的web应用。这对于小应用来说,通常是不错的,十分易于学习和实验。 但是,当你的应用在体积和复杂性上都变得越来越高时,情况就变得复杂了。你的代码可能会变得凌乱。当你的团队人数增加时,向在同一个代码库内写代码变得愈发困难,每次合并代码时都可能会出现各种各样的冲突。为应用增加新的特性和处理新的情况可能都会改变文件的结构。 一个好的文件结构,应该是每一个不同的文件或文件夹,都分别负责处理不同的任务。这样,在添加新特性时才会变得不会有冲突。 ## 最佳实践 这里所推荐的结构是基于MVC设计模式的。这个模式在职责分离方面做得非常好,所以让你的代码更具有可维护性。在这里我们不会去过多地讨论MVC的优点,而是更多地讨论如果使用它来建立你的`Express`应用的文件结构。 例子: 让我们来看下面这个例子。这是一个用户可以登录,注册,留下评论的应用。以下是他的文件结构。 ``` project/ controllers/ comments.js index.js users.js helpers/ dates.js middlewares/ auth.js users.js models/ comment.js user.js public/ libs/ css/ img/ views/ comments/...

Blog

## 前言 `Express` 5.0 仍处于`alpha`版中,但是我们还是想先来初窥一下新的`express`版本中将会有哪些改变,以及如何将你的应用从`Express` 4 迁移至 `Express` 5。 `Express` 5 与`Express` 4 的区别,并有像之前从`Express` 3 更新至 `Express` 4 时的那样非常巨大。但是,仍然还是有几个API有了颠覆性的变化。这意味着你的`Express` 4 应用在更新至`Express` 5 之后,将有可能不能运行。 ## 安装 想要使用`alpha`版的`Express` 5 ,你只需在你应用的根目录下运行命令: ``` SHELL...

Blog

## 前言 安全性,总是一个不可忽视的问题。许多人都承认这点,但是却很少有人真的认真地对待它。所以我们列出了这个清单,让你在将你的应用部署到生产环境来给千万用户使用之前,做一个安全检查。 以下列出的安全项,大多都具有普适性,适用于除了`Node.js`外的各种语言和框架。但是,其中也包含一些用`Node.js`写的小工具。 ## 配置管理 ### 安全性相关的HTTP头 以下是一些安全性相关的HTTP头,你的站点应该设置它们: - `Strict-Transport-Security`:强制使用安全连接(SSL/TLS之上的HTTPS)来连接到服务器。 - `X-Frame-Options`:提供对于[“点击劫持”](https://www.owasp.org/index.php/Clickjacking)的保护。 - `X-XSS-Protection`:开启大多现代浏览器内建的对于跨站脚本攻击(XSS)的过滤功能。 - `X-Content-Type-Options`: 防止浏览器使用`MIME-sniffing`来确定响应的类型,转而使用明确的`content-type`来确定。 - `Content-Security-Policy`:防止受到跨站脚本攻击以及其他跨站注入攻击。 在`Node.js`中,这些都可以通过使用[Helmet](https://www.npmjs.com/package/helmet)模块轻松设置完毕: ``` js var express = require('express'); var helmet =...

Blog

## 前言 胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性。有传闻说,箭头函数的语法`=>`,是受到了`CoffeeScript`的影响,并且它与`CoffeeScript`中的`=>`语法一样,共享`this`上下文。 箭头函数的产生,主要由两个目的:更简洁的语法和与父作用域共享关键字`this`。接下来,让我们来看几个详细的例子。 ## 新的函数语法 传统的`JavaScript`函数语法并没有提供任何的灵活性,每一次你需要定义一个函数时,你都必须输入`function () {}`。`CoffeeScript`如今之所以那么火,有一个不可忽略的原因就是它有更简洁的函数语法。更简洁的函数语法在有大量回调函数的场景下好处特别明显,让我们从一个`Promise`链的例子看起: ``` js function getVerifiedToken(selector) { return getUsers(selector) .then(function (users) { return users[0]; }) .then(verifyUser) .then(function (user, verifiedToken) {...

Blog

## 前言 EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民。但是目前为止,这些关于类的新关键字仅仅是建立在旧的原型系统上的 语法糖,所以它们并没有带来任何的新特性。不过,它使代码的可读性变得更高,并且为今后版本里更多面向对象的新特性打下了基础。 这样做的原因是为了保证向后兼容性。也就是,旧代码可以在不做任何hack的情况下,与新代码同时运行。 ## 定义类 让我们回想一下在ES5中定义一个类的方式。通过不是很常用的`Object.defineProperty`方法,我可以定义一些只读的属性。 ``` js function Vehicle(make, year) { Object.defineProperty(this, 'make', { get: function() { return make; } }); Object.defineProperty(this, 'year', { get:...

Blog

## 前言 EcmaScript 2015 (又称ES6)提供一个全新的`迭代器`的概念,它允许我们在语言层面上定义一个(有限或无限的)序列。 暂时先抛开它。我们对于`for`循环以及它的兄弟`for-in`循环,都已经十分的熟悉。后者可以被用来帮助我们理解迭代器。 ``` js for (var key in table) { console.log(key + ' = ' + table[key]); } ``` 对于`for-in`循环,它有许多的问题。但是最大的问题,便是它不保证迭代的顺序。但是当我们使用ES6迭代器时,这个问题就迎刃而解了。 ## for-of `for-of`是ES6中的新语法,用来配合迭代器。 ``` js for...

Blog