sails.debugger js如何使用debugger

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Node.js与Sails ~项目结构与Mvc实现及日志机制
转载 & & 作者:张占岭
Sails是一个Node.js的中间架构,很方便的帮助我们搭建web应用程序。还有node.js与Sails日志机制在本文中也讲到了,需要的朋友可以一起学习下
本文首先从sails的安装讲起接下来介绍node.js与Sails的日志机制,小伙伴们已经迫不及待要看下文了吧,好吧。
Sails是一个Node.js的中间件架构,帮助我们很方便的构建WEB应用程序,网址:,它主要是在Express框架的基础上发展起来的,扩展了新的功能组件,下面我们来看一下安装方法
一 安装Sails
npm -g install sails
二 建立一个Sails的项目
sails new testProject
三 启动项目
cd testProject
sails lift
四 项目的结构,基于MVC理念
我们可以看到它与是由model,view,controller组成,它们之间的调用关系与.net mvc十分类似,只不过.net mvc里的model主要是指viewmodel,而在sails里model主要是数据模型,即.net里的Entity,它是数据表的一种抽象,对于数据的持久化,sails提供了很多种,如本地文件,mysql,mongodb,redis等,对于sqlserver我们也可以找到第三方的组件。
五 通过controller的action来渲染视图
我们在.net mvc里,大家都知道视图是通过action的render方法进行渲染的,其时sails也是这样的,可以使用原生的render,也可以使用封装好的view方法,而在视图上直接使用你的action返回的对象即可。
controller/action的内容
module.exports={
index: function (req, res){
return res.view("test/index",{title:"大叔",engTitle:"Lind"});
//return res.view("view_name",data)//view_name参数为空表示用当前的action
view-ejs的内容
&p&从action返回的对象-title:&%=title%&&/p&
&p&从action返回的对象-engTitle:&%=engTitle%&&/p&
调用的结果如下
如果进入index页面可以直接写控制器名称
如果其它action希望走/test这样的路由,需要在config/route.js里进行配置,如为add这个action添加路由为/user,它的设置如
'get /user': {view: 'user/add',locals: {layout: null}},
'get /test':{view:'test/index',locals:{layout:null}}
好了,到这样一个最简单的MVC的DEMO就做好了,下一节我们将引用Model,即数据持久化的机制,进行对数据表的curd操作,敬请期待...
ps:Node.js与Sails~日志机制
看到Sails的日志就会想起来log4net,确实它们在很多地方是相似的,都是采用分级别记录的方式,而sails我觉得在使用上更加方便,它不需要我们做多于的事情,直接sails.log.级别("你的日志内容")就搞定了,你不需要关心什么单例,或者持久化方式,Sails的日志只是对console.log的一种补充,可以理解为分了类之后的console.log,并有颜色的区分,呵呵。
一 我们来看一下sails.log的日志级别
Log fns visible
.warn(),&.error()
.debug(),&.warn(),&.error()
.info(),&.debug(),&.warn(),&.error()
.verbose(),&.info(),&.debug(),&.warn(),&.error()
.silly(),&.verbose(),&.info(),&.debug(),&.warn(),&.error()
二 开始测试我们的日志
&&&&&&& sails.log('debug日志!');//sails.log.debug("debug")
&&&&&&& sails.log.error('error日志!');
&&&&&&& sails.log.warn('warn日志!','request aborted.');
&&&&&&& sails.log.info('info日志!');
&&&&&&& sails.log.verbose('verbose日志!');
&&&&&&& sails.log.silly('silly日志!');
三 配置项目的日志级别,位于config/log.js
module.exports.log = {
&& level: 'info'
四 从结果中看到,日志记录时,只记录比当前配置级别低的日志内容
怎么样,sails的日志挺方便吧!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Sails是一个Node.js的中间件架构,帮助我们很方便的构建WEB应用程序,网址:http://www.sailsjs.org/,它主要是在Express框架的基础上发展起来的,扩展了新的功能组件,下面我们来看一下安装方法
一 安装Sails
npm -g install sails
二 建立一个Sails的项目
sails new testProject
三 启动项目
cd testProject
sails lift
四 项目的结构,基于MVC理念
我们可以看到它与是由model,view,controller组成,它们之间的调用关系与.net mvc十分类似,只不过.net mvc里的model主要是指viewmodel,而在sails里model主要是数据模型,即.net里的Entity,它是数据表的一种抽象,对于数据的持久化,sails提供了很多种,如本地文件,mysql,mongodb,redis等,对于sqlserver我们也可以找到第三方的组件。
五 通过controller的action来渲染视图
我们在.net mvc里,大家都知道视图是通过action的render方法进行渲染的,其时sails也是这样的,可以使用原生的render,也可以使用封装好的view方法,而在视图上直接使用你的action返回的对象即可。
controller/action的内容
module.exports={
index: function (req, res){
return res.view("test/index",{title:"大叔",engTitle:"Lind"});
//return res.view("view_name",data)//view_name参数为空表示用当前的action
view-ejs的内容
&p&从action返回的对象-title:&%=title%&&/p&
&p&从action返回的对象-engTitle:&%=engTitle%&&/p&
调用的结果如下
如果进入index页面可以直接写控制器名称
如果其它action希望走/test这样的路由,需要在config/route.js里进行配置,如为add这个action添加路由为/user,它的设置如
'get /user': {view: 'user/add',locals: {layout: null}},
'get /test':{view:'test/index',locals:{layout:null}}
好了,到这样一个最简单的MVC的DEMO就做好了,下一节我们将引用Model,即数据持久化的机制,进行对数据表的curd操作,敬请期待...
阅读(...) 评论()Sails 中的路由和控制器
此内容是该系列 4 部分中的第 # 部分: 面向 JavaScript 开发人员的 Sails.js 指南,第 4 部分http://www.ibm.com/developerworks/cn/views/web/libraryview.jsp?search_by=%E9%9D%A2%E5%90%91+JavaScript+%E5%BC%80%E5%8F%91%E4%BA%BA%E5%91%98%E7%9A%84+Sails.js+%E6%8C%87%E5%8D%97敬请期待该系列的后续内容。此内容是该系列的一部分:面向 JavaScript 开发人员的 Sails.js 指南,第 4 部分敬请期待该系列的后续内容。
欢迎!Sails 粉丝们!在我们的中,您学习了如何在 Sails.js
中将模型与其他模型关联。使用显式关联将通用关系非常好地集成到代码中,但不是所有操作都适合放入一个模型实例中。本期教程将介绍 Sails 控制器,您将使用它们来管理 Sails
应用程序中的更复杂操作。自定义模型操作目前为止,我们的进展非常顺利,我们使用了 Sails 的默认路由来访问或修改模型实例。这些默认设置(包含在 Sails Blueprint API 中)负责我们期望从 Web
或移动应用程序获得的基本的创建(create)、读取(read)、更新(update)和删除(delete)功能。但是所有开发生产 HTTP API 的开发人员都会告诉您,简单的
CRUD 只有这点能耐。即使您从这里着手,也需要能够定制基本路由与控制器的映射。Blueprint API
对您很有帮助,但最终您需要某个更强大、灵活和可自定义(或同时具备这三种特性)的工具来构建您的客户和用户想要的应用程序。对于大部分开发周期,都可以使用蓝图路由来建立原型,然后将此框架替换为自定义的路由和关联的控制器。除了 CRUD 路由,一个常规 Sails.js 安装中已经预先定义了其他一些控制器-路由组合。但是,从很大程度上讲,您往往想创建自己的映射来获得所需的行为。映射复杂的查询在中,您将我们最开始拥有的博客 API
扩展为了一个更庞大的内容管理系统(CMS)后端。尽管您目前构想的是让这个应用程序为一个网络博客提供支持,但它还可以用于其他用途。该 RESTful API
可供几乎任何想要获取并显式博客文章或 RSS 提要的前端应用程序访问,而且它允许搜索查询。扩展该 API 后得到了多种新模型类型,分别是
Author、Entry 和 Comment。每个 Entry 拥有一个
Author 和 Comment,这些类型也链接回它们引用的 Entry。切换成 CMS 后,越来越明确地表明您希望能够设置 Sails
的默认路由所不支持的操作。假设您想能够发出复杂的查询(比如针对一个由特定作者在特定日期后编写的,按给定条件进行组织的文章),或者获取与一个特定标签对应的所有文章。您可能需要提供的不是采用原生
JSON 的格式,而是采用兼容 RSS 或 Atom 的 XML 格式的文章。在输入端,您可能希望添加一个导入功能,使 CMS 能够通过 RSS 或 Atom
提要获取并存储完整的现有博客。实际上,您可以做很多事情,而且许多事情都是 Sails 默认不支持的。控制器的作用在传统 MVC
模式中,控制器(controller)定义模型(model)与其视图(view)之间的交互。当某个模型的数据发生更改时,控制器会确保附加到该模型的每个视图都会相应地更新。用户在视图内执行某项操作时,控制器也会获得通知。如果该操作必须更改某个模型,控制器会向所有受影响的视图发出通知。从架构角度讲,模型、控制器和视图都是在服务器上定义的。视图通常是某种形式的
HTML 模板(理想情况下包含极少的代码);模型是域类或对象;控制器是路由背后的代码块。在 HTTP API 中,三个应用程序组件之间的关系类似但不等同于 MVC。不同于 MVC 架构,HTTP API
的模型、视图和控制器通常并不都包含在同一个服务器上。具体地讲,视图通常位于服务器外,会是一个单页 Web 应用程序或移动应用程序的形式。在架构上,HTTP API 或多或少与 MVC 应用程序有些类似:视图 显示了通过 HTTP API 收到的数据。 模型 是通过线路交换的工件。(HTTP API 使用了一种专为简化传输而设计的模型,该模型有时称为 ViewModel。)控制器 是 API 的动词形式;它们的存在是为“执行”某个操作而不是“成为”某个东西。在 HTTP API 中,当一个视图将 HTTP 请求传到控制器端点时,该请求直接依靠控制器来执行。控制器获取通过 URL
或请求正文传入的数据,对一个或多个现有模型执行某个操作(或创建新模型),并生成响应返回给视图来进行更新。控制器的响应通常是 API 开发人员定义的 HTTP 状态代码和 JSON
主体的组合。理论介绍得已经足够多了,现在让我们开始实现控制吧。创建一个控制器开始使用 Sails 控制器的最简单方法是,创建一个返回静态数据的控制器。在本例中,您将创建一个简单的控制器,它返回 CMS API
的一个用户友好的版本。这将是一个运行迅速且容易使用的 API,业务客户可使用它测试服务器是否在正常运行。客户还能够大体了解任何最近的更改,比如对 API 的升级,并相应地调整其 Web
或移动前端。可通过两种方式在 Sails 中创建新控制器:可以使用 sails 命令生成框架,或者可以让这些文件为您生成控制器。在后一种情况下,生成器使用 Sails
约定规则所定义的命名系统来识别和放置文件,这些文件通常是空的。对于第一个控制器,我们将会使用生成器:~$ sails generate controller System
info: Created a new controller ("System") at api/controllers/SystemController.js!控制器位于您的 Sails 项目的 api/controllers 目录中。根据约定,它们拥有 controller
后缀。如果您在控制器名称后附加额外的描述符,Sails
会假设这些是要在控制器上执行的操作(方法)。通过提前指定操作,您可以节省一些步骤;否则默认生成器会生成一个空的控制器,如这里所示:
* SystemController
* @description :: Server-side logic for managing the System
:: See http://sailsjs.org/#!/documentation/concepts/Controllers
module.exports = {
};运行一个稍微不同的命令——sails generate controller System version——会留下更多工作让您处理:
* SystemController
* @description :: Server-side logic for managing Systems
:: See http://sailsjs.org/#!/documentation/concepts/Controllers
module.exports = {
* `SystemController.version()`
version: function (req, res) {
return res.json({
todo: 'version() is not implemented yet!'
};添加命令会对搭建的方法端点进行布局,但您可以看到,这些命令目前未执行太多工作,仅返回有帮助的错误消息。使用该生成器创建已建立框架的控制器,最初可能很有帮助。随着时间的推移,许多开发人员最终仅在自己最喜欢用的文本编辑器中执行
File|New。如果您决定这么做,则需要正确地命名该文件和端点(例如 foocontroller.js 中的
FooController),并手动编写导出的函数。这些方式都没有对错,所以请使用最适合您的方式。实现第一个简单的控制器非常容易:module.exports = {
* `SystemController.version()`
version: function (req, res) {
return res.json({
version: '0.1'
};绑定和调用控制器接下来,您希望绑定您的控制器,然后调用它。绑定(Binding)将控制器映射到一个路由;调用(invoking)向该路由发出合适的 HTTP
请求。基于此控制器的文件名和所调用方法的名称,此控制器的默认路由将是 /System/version。就个人而言,我不喜欢将“system”放在 URL 中,而是更喜欢使用“/version”。Sails
允许将控制器的调用绑定到选择的任何路由,所以我们将它设置为绑定到 /version。您可以在 Sails 路由表中创建一个条目来设置控制器路由,该路由表存储在 config/routes.js 中。只要您创建一个 Sails
应用程序,就会生成这个默认文件。除去所有注释后,此文件几乎是空的:
module.exports.routes = {
/***************************************************************************
* Make the view located at `views/homepage.ejs` (or `views/homepage.jade`, *
* etc. depending on your default view engine) your home page.
* (Alternatively, remove this and add an `index.html` file in your
* `assets` directory)
***************************************************************************/
view: 'homepage'
};大体上讲,config/routes.js 包含一组路由(routes)和目标(targets)。路由是相对
URL,目标是您希望 Sails 调用的对象。默认路由是 / URL 模式,它调出 Sails 的默认主页。如果您愿意的话,还可以将此默认路由替换为一个常规
HTML 页面。这样,该 HTML 将位于您的 assets 目录中,就在我们将一直使用的 api 目录旁边。升级 CMS 的 HTML 对于像
这样的单页应用程序框架可能是一种有趣的练习,但这里的目的是添加一个 /version 路由,并让它指向
SystemController.version 方法。为此,您需要向 config.js 所导入的 JSON
对象添加额外的一行代码:module.exports.routes = {
'get /version': 'SystemController.version'
};将此路由保存到 config.js 文件中后,向 /version 发出 HTTP GET 请求会发回您之前设置的相同 JSON
结果。Blueprint API 中的控制器创建模型时,Sails
的工具会自动为该模型创建一个控制器。所以,即使您没有打算创建它们,您的每个方法也已经有一个控制器:AuthorController、EntryController
等。为了进一步熟悉 Sails 控制器和路由,我们假设您希望 AuthorController 持有一个方法,该方法返回您 CMS
中所有作者的简历的聚合列表。该实现非常简单——只需要获取所有 Authors,提取它们的简历,并传回该列表:module.exports = {
bios: function(req, res) {
Author.find({})
.then(function (authors) {
console.log("authors = ",authors);
var bs = [];
authors.forEach(function (author) {
name: author.fullName,
bio: author.bio
res.json(bs);
.catch(function (err) {
console.log(err);
res.status(500)
.json({ error: err });
};如果您使用了默认的 /author/bios 路由,您的 routes.js
中甚至不需要特殊条目。在这种情况下,默认条目就够用了(如果您不这么认为,您知道如何更改它),所以我们暂时保留默认路由。测试状态您可能发现种子控制器(seed controller)对一些测试很有用。这种控制器将数据库初始化为一种已知状态,就象这样:module.exports = {
run: function(req, res) {
Author.create({
fullName: "Fred Flintstone",
bio: "Lives in Bedrock, blogs in cyberspace",
username: "fredf",
}).exec(function (err, author) {
Entry.create({
title: "Hello",
body: "Yabba dabba doo!",
author: author
}).exec(function (err, created) {
Entry.create({
title: "Quit",
body: "Mr Slate is a jerk",
author: author.id
}).exec(function (err, created) {
return res.send("Database seeded");
};在这种情况下,该已知状态被绑定到控制器的默认路由 /seed/run。您还可以为不同的测试和/或开发场景设置不同的种子方法(seed
method)。对于所关注的路由,可使用 curl 命令将数据库设置为特定状态。但需要确保您在生产代码中禁用或删除了这些路由。管理控制器输入现在,您已拥有一个没有输入的非常简单的控制器。但是,控制器通常需要从调用方获取输入。有三种类型的控制器输入:请求正文中发送的表单参数。这是通过 Web 接受输入的传统机制。通过请求正文中的 JSON 对象发送的输入数据。此概念与表单参数相同,但发送的内容类型为 application/json,而不是
form/multipart-form-data。客户端通常更容易生成输入数据,而且服务器也更容易使用。通过参数指定并通过 URL 路由中的占位符发送的输入。请求某个特定作者的文章时,您通常希望在 URL 自身中传递作者标识符。一个示例是
/author/1/entries,其中的“1”是作者的唯一标识符。这样,您就保留了博客文章包含在作者资源中的外观,即使这些文章在物理上未与该作者存储在一起。(示例应用程序就是如此,Entry
对象存储在一个与 Author 对象不同的集合或表中。)表单参数属于传统的 Express 样式 request.getParam() 调用的领域,已在其他地方具有明确规定。而且 HTTP API
也不经常使用表单参数,所以我们暂时放弃该方法。第二种方法非常适合 CMS 应用程序。获取输入捕获通过 JSON 对象发送的值通常很简单,只需使用一个 request.body.field。如果输入是一个位于 JSON 最高层级的数组,您则可以使用
request.body[idx].field。首先,您将创建一个端点,它将返回 CMS 数据库中所有 Entry 对象的 RSS XML
提要。(在实际的系统中,需要限制此数字来支持分页模式,比如返回最近的 20 篇文章,但我们暂时保持简单即可。)命名您的控制器(我在下面选择了
FeedController),并在它之上放置一个 RSS 方法,使默认路由(/feed/rss)变得有意义:var generateRSS = function(entries) {
'&rss version="2.0"&' +
'&channel&' +
'&title&SailsBlog&/title&';
entries.forEach(function (entry) {
rss += '&item&' +
'&title&' + entry.title + '&/title&' +
'&description&' + entry.body + '&/description&' +
'&/item&';
// Closing
rss += '&/channel&' +
module.exports = {
rss: function (req, res) {
Entry.find({})
.then(function (entries) {
var rss = generateRSS(entries);
res.type("rss");
res.status(200);
res.send(rss);
.catch(function (err) {
console.log(err);
res.status(500)
.json({ error: err });
};现在,这是一个很小的提要,但是,如果您想将提要限制到一个或多个特定作者,该怎么办?在这种情况下,您需要设置一个新路由(/author/{id}/rss)。新路由将获取
URL 中传递的标识符,然后使用它限制查询,仅查找给定作者编写的文章。该 RSS 方法的剩余部分基本相同。我们看看该方法在代码中的效果。首先,FeedController 获取一个针对每个作者的 RSS 方法,就像之前一样:var generateRss = // as before
module.exports = {
rss: // as before
authorRss: function(req, res) {
Entry.find({ 'author' : req.param("authorID") })
.then(function (entries) {
var rss = generateRSS(entries);
res.type("rss");
res.status(200);
res.send(rss);
.catch(function (err) {
console.log(err);
res.status(500)
.json({ error: err });
};不同的是上面是一个查询,它现在被限制为仅查找所有具有某个作者 ID 的 Entry 对象。请注意 HTTP 请求中包含的参数
authorID 的指令。authorID(在本例中为传入的 URL 模式的第三部分)的映射在
routes.js 文件中指定,如下所示:var generateRss = // as before
module.exports = {
rss: // as before
authorRss: function(req, res) {
Entry.find({ 'author' : req.param("authorID") })
.then(function (entries) {
var rss = generateRSS(entries);
res.type("rss");
res.status(200);
res.send(rss);
.catch(function (err) {
console.log(err);
res.status(500)
.json({ error: err });
};routes 文件中指定的参数是区分大小写的,所以请确保您保持了一致的命名约定。大小写差异是应用程序代码中一种常见但不易察觉的错误来源。结束语模型仅处理与数据相关的定义,而控制器可以处理应用程序逻辑中所有非特定于数据的部分。除非您需要特定的逻辑或约束,否则没有理由替换 Blueprint API 中使用的标准 REST
控制器。即使您需要特定的逻辑或约束,也可以经常使用现有的 Blueprint 路由作为起点。如果您是从头开始学习本系列的,那么您现在已经很好地掌握了 Sails.js。您可以在 Bluemix
上开始使用它,定义一些模型,访问和更新您的模型,插入/更新/删除和查询它们,并创建非特定于所传递模型的端点。简而言之,您获得了在一个非平凡的 HTTP API 项目中开始使用
Sails.js 所需的所有工具。显然,还有更多功能可供探索。在以后某个时刻,您可能希望知道如何插入您自己的 ORM/ODM(而不是使用中介绍的默认的 Waterline),或者钻研 Sails 引擎深入的配置选项。您可能还想配合使用 Sails 和
Ember.js 来实现一个强大的可行 SANE 堆栈。但就目前而言,您已经入门,也就是说,是时候最后一次说路途愉快了!
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=http://www.ibm.com/developerworks/js/artrating/SITE_ID=10Zone=Web developmentArticleID=1039242ArticleTitle=面向 JavaScript 开发人员的 Sails.js 指南,第 4 部分: Sails 中的路由和控制器publish-date=sails js 在 DJI 官网的应用(二)——
多语言 - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
目前,,支持8种语言,还在不断的增加。
多语言系统关键构成部分包括三个部分,录入,存储词条并提供接口,后台程序调用并显示。核心系统,我们称之为翻译中心,使用key来与词条对应,开发时,我们在页面上需要调用多语言的地方写入key,然后,渲染页面时,获取页面上的key,在加上本次请求的对应语言后,向翻译中心发起请求,获得响应后,替换key,并显示对应文本到页面。
在sails中,集成的是node-i18n这个多语言模块,但是,这个模块的功能较弱,不能适应我们当前的多语言需求,故而,我们开发了自己的多语言模块。
有以下下几个关键问题:
1、node是异步执行的
JS是异步执行的,这个对于前端来说,是家常便饭。问题出在什么地方呢?如果,是ruby这类同步执行的语言,那么好了,渲染模板,逐条的翻译即可,反正,你必须要完成了请求,拿到了翻译,才会执行下一条。但是,node不一样了,它不会等你的,发出请求,不等响应,直接去翻译下一条了。意思就是你的页面渲染都已经完成了,但是,可是,你的翻译还在路上呢。用户,看到的就是key,不是文本。这怎么办?苦苦的思索,也找了好久,终于,在阳台上来回踱步的时候,想到了一个办法。什么? 问题的关键在于什么?想想看。我必须,首先拿到页面上翻译的key才能够,去拿到对应的翻译。我提前是不知道的,只有页面可以告诉我。
第一个办法是,建一个key的配置文件,然后跟页面使用route关联起来,这样就可以读配置拿到翻译了。但是,额外工作太多,不够丝滑,一定要以最自然的方式来开发,这是原则。这种尝试在实际工作中非常多,只有,以丝滑为基本原则,不断加以改进,在日后的开发和维护中,才能够加倍收益。
第二办法来了,什么?灵感来自于模板引擎的一个方法,compileFIle,这个方法可以编译指定的模板,但是不渲染出去,那如果我提前编译一次,是不是就可以拿到页面key了呢?又不会渲染出去。拿到key后,再并发的调用翻译接口,就能以比同步快得多的速度,拿到翻译,存入I18n对象。最后,再调用回调函数,render模板,这个时候,再去调用翻译,就是直接从内存里去了,不再是异步的了,页面翻译自然,华丽的展示在万千用户的眼前。
2、当前的请求的语言是什么?
如何知道,当前用户请求的是什么语言的页面呢?英文?中文?韩文?,(不考虑修改子域名)对于一个非ajax得get请求,请求头前端基本改不了,但有三个东西可以利用,页面路径,cookie,请求参数。
对于,页面路径,我们可以在路径上携带语言信息,如 /cn/support, /kr/support … 优点是对seo是有利的 ,而且,容易辨识定位问题,
对于,cookie ,可以将语言信息写入cookie,切换语言时改变cookie,不允许从路径中改变,好处是有效统一语言切换入口,缺点是,cookie可能被禁用,不利于多语言seo。
请求参数,同路径,但是基本不怎么用,对seo同样不友好。综
上所述,出于,seo,页面缓存(后面会提到)的考虑,我们选择了第一种方案,在页面路径上携带语言信息。
好了,现在服务器拿到了语言信息,是不是万事大吉了呢?当然不是,有一个这样的变量 I18n.locale 对应从路径中取出的语言信息,开发时没有什么问题的,要英文,要中文,高高兴兴拿去测试,那么问题来了?为什么,有时候我明明请求的中文,却返回英文. 找bug吧,抽风?网络传输错误?语言提前有误?缓存有误? 还是,你用了全局变量。注意,全局变量,在多用户的环境下,必须慎用。我 发了一个请求 /cn/phantom-4, node程序也拿到了当前语言 cn , 正要去那翻译呢。几乎同时,请求 /de/phantom-4来了,locale瞬间被改变了,现在拿到的将是德语翻译,用户一看,就开始怀疑人生了。怎么办?
这个问题,在没有答案之前,几乎令我抓狂,有没有一种变量,生命周期是在这个请求内,而且,可以被共享。没有?有?当然有,你观察一下就会发现,各个中间件里传递着一个神奇的变量,req,对于每一个请求而言,这个对象都是不同的。来吧,改造一下,把所有依赖于当前请求的属性,方法,重新绑定到req对象上。虽然,调整很大,但是总算可用了,可是上线后又出现了类似问题,这尼玛,就不得不怀疑人生了。我错了?
还是我被骗了,几乎把断点从开始打到结束,终于发现了,诡异!我使用了一个语言变量,req.locale, 它本来也没啥问题,但是,前面表现正常的它,后面竟然变量被改写了,我找遍了我的代码,发现并没有改变过这个变量呀,奇怪了?难道是?我忽然想起,node-I18n貌似也使用了这个变量,它判断语言跟我们可不一样,查了查源码,果然有这句。换了一个变量后,发现一切只有那么正常了,再也不抽风了。
1、以丝滑为原则,不断改进代码。不论是,helper方法,数据接口,必须让上层调用,直接,简单,灵活。
2、多用户应用,务必慎用全局变量,req,contxt,this之类的才是更好的选择。
系列文章:
下一章节将会向大家讲述缓存的实现与管理:
DJI 官网团队持续招人中 ,欢迎NB的前端/全栈工程师们,加入我们一起奋斗,打造一流的技术团队,
来吧朋友,国内绝对一流的工资、福利,甚至期权,等你来拿,简历可发送至
其实还是没扯到 sails
我们只是以 sails 作为底层技术框架,不会对sails 这门语言做过多的介绍,讲语言本身身就是个过时的事情,
可能是标题误导,见谅
很好,我赞赏这种有一说一的文章,比抛书包强
自豪地采用
用 Sails 可以试试 ThinkJS,不管是性能还是易用性,ThinkJS 都完胜 Sails
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的}

我要回帖

更多关于 js 断点 debugger 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信