我想编写一个快速中间件函数,在响应的'end'事件(如果存在)上设置一个监听器.目的是根据结束处理程序决定发送的http响应代码进行清理,例如记录响应代码和db事务的回滚/提交.即,我希望这个清理对结束调用者是透明的.
我想在快递中做以下的事情:
路由中间件
function (req, res, next) {
res.on ('end', function () {
// log the response code and handle db
if (res.statusCode < 400) { db.commit() } else { db.rollback() }
});
next();
}
Run Code Online (Sandbox Code Playgroud)
路线:
app.post ("/something", function (req, res) {
db.doSomething (function () {
if (some problem) {
res.send (500);
} else {
res.send (200);
}
});
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,'end'事件处理程序永远不会被调用.同样的res.on('close'),我在另一篇文章中读到过.这样的事件会被解雇吗?
我能想到的另一种方法是在自定义中间件中包装res.end或res.send使用我自己的版本.这不是理想的,因为res.end并且res.send不接受回调,所以我不能只是包装它们,调用原始然后根据他们回电话时设置的响应代码做我的事情(因为他们不会打电话我回来了).
有一个简单的方法吗?
我正在使用node.js和此请求模块对另一台服务器进行HTTP调用.
https://github.com/mikeal/request
它很棒.我现在需要使用我公司的SSL证书修改此代码以通过SSL进行调用.在请求模块的文档中,它说明了strictSSL选项:
"strictSSL - 设置为true以要求SSL证书有效.注意:要使用您自己的证书颁发机构,您需要指定使用该ca作为选项创建的代理."
这听起来像我需要做的,但我不明白这句话:"指定一个用该ca作为选项创建的代理."
1)"代理人"是什么意思?2)如何"指定代理"3)如何创建代理"以该ca作为选项"?
代码示例会很棒,但任何潜在客户都会有所帮助.谢谢.
据我所知,我正在配置我的全局中间件功能,如文档和关于该主题的每个论坛帖子中所述,但它没有被调用.有谁看到我做错了什么?表达3.2.5.在日志输出中,我看到以下内容:
Express server listening on port 9000
inside route
GET / 200 7ms - 2b
Run Code Online (Sandbox Code Playgroud)
我希望看到"内部中间件",然后"内部路由".相反,我只看到"内部路线".
代码:
var express = require('express'), http=require('http'), path=require('path');
var app = express();
app.enable('trust proxy');
app.set('port', process.env.PORT || 9000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.set('layout', 'layout');
app.use(require('express-ejs-layouts'));
app.use(express.favicon(__dirname + '/public/images/favicon.ico'));
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride())
app.use(express.cookieParser('kfiwknks'));
app.use(express.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
if ('development' == app.get('env')) {
app.use(express.errorHandler());
} else {
app.use(function(err, req, res, next){
console.error (error);
res.send (500, "Internal server error");
});
}
app.use (function (req, res, …Run Code Online (Sandbox Code Playgroud) 我目前正在一个新项目上使用Jade.它似乎非常适合编写webapp布局,但不适合编写静态内容,例如网页
包含文字的元素.
例如,要创建这样的段落,我相信我需要这样做:
p
| This is my long,
| multi-line
| paragraph.
Run Code Online (Sandbox Code Playgroud)
对于充满真实段落文本的静态网页,由于每行开头的管道符号,使用玉石成为负担.
是否存在某种语法糖用于将整个块标记为文本节点,因为管道符号逐行进行?或者我不知道的现有过滤器?
我正在探索的一个解决方案是创建一个:块过滤器或其他东西,它在每行前面加上| 然后将它传递给Jade,但是jade关于创建过滤器的文档至少可以说是稀疏的,所以可能需要一段时间来弄明白.如果有人能就这样的解决方案提供指导,我会很感激.
我已经看到了当它与它生成的主键不同步时更新序列的解决方案,但我不明白这个问题是如何发生的.
有没有人能够深入了解主键字段(默认定义为序列的下一个字段,其主键未在任何地方显式设置)如何与序列不同步?我正在使用Postgres,我们看到这种情况时不时发生.当序列为现有行生成id时,它最终会产生重复键约束.
在设置最大连接池大小时,我找不到node-postgres驱动器的任何文档,或者如果它不可配置,甚至找不到它的内容.有谁知道如何设置最大连接数,或默认情况下它是什么?
我的任务是将一个进程分成许多并行运行的小进程,分发给许多从机.请求通过HTTP传入,服务器将其分解为发送到从属计算机的多个子进程,等待所有从属请求返回响应,然后将聚合结果整理为单个数据对象,作为结果返回顶级请求.我认为node.js会很有用,但由于它是单线程的,我无法确定这是否可能,或者它是否会阻止等待每个请求返回之后再转到下一个请求.这可能与node.js一起使用吗?如果是这样,有人会指出我正确的方向吗?即一个节点模块使用或概述它将如何完成?
谢谢你的帮助.
.opam当您运行时, dune 将生成并更新项目的文件dune build,让您只需管理dune-project.
然而,在添加新的依赖项时,这似乎需要一个尴尬的步骤。我能弄清楚的唯一事件顺序似乎是:
dune-project节中depends。dune build:.opam使用新的依赖项更新文件,并失败并显示缺少新依赖项的错误。opam install . --deps-onlydune build: 成功了。这是预期的流程吗?因错误而失败的步骤dune build,以获得更新 . opam文件,似乎不正确。
作为构建步骤的一部分,是否有一个 dune 子命令仅使用 dune-project 中的依赖项更新 opam 文件,或者是否有一个 dune 子命令将更新 opam 文件并根据更新的 opam 文件更新已安装的依赖项?
或者上述事件顺序是预期的流程吗?
为了避免此处描述的问题:
无法从程序集'mscorlib加载类型'System.Runtime.CompilerServices.ExtensionAttribute'
我正在尝试构建我的项目以.net 4.0而不是4.5(在Visual Studio 2013中),但我收到以下错误:
找不到类型或命名空间名称'Newtonsoft'(您是否缺少using指令或程序集引用?)
无法解析主要参考"Newtonsoft.Json",因为它是针对".NETFramework,Version = v4.5"框架构建的.这是比当前目标框架".NETFramework,Version = v4.0"更高的版本.
所以我想安装一个与.net 4.0兼容的json.net版本.我看到下载的NuGet包除了lib/4.5之外还包含一个lib/4.0目录,但是我无法弄清楚如何让包管理器使用它来代替4.5版本.
如何使用与.net 4.0兼容的json.net版本而不是仅适用于.net 4.5的版本来获取我的项目解决方案?
我正在使用node.js实现一个webapp并使用jade模板引擎表达.
模板呈现正常,可以访问助手和动态助手,但不能访问"body"局部变量以外的局部变量,该变量由express提供,并且在layout.jade中可用并定义.
这是一些代码:
app.set ('view engine', 'jade');
app.get ("/test", function (req, res) {
res.render ('test', {
locals: { name: "jake" }
});
});
Run Code Online (Sandbox Code Playgroud)
这是test.jade:
p hello
=name
Run Code Online (Sandbox Code Playgroud)
当我删除第二行(引用名称)时,模板正确呈现,在网页中显示"hello"一词.当我包含= name时,它会抛出一个ReferenceError:
500 ReferenceError: Jade:2 NaN. 'p hello' NaN. '=name' name is not defined
NaN. 'p hello'
NaN. '=name'
Run Code Online (Sandbox Code Playgroud)
我相信我正在关注玉,并完全根据局部变量表达例子.我做错了什么,或者这可能是快递或玉器中的错误?
我正在使用node.js和jasmine-node npm模块来运行测试.除非代码产生错误,否则这很有效.我没有堆栈跟踪.例如,我的一个测试只输出:
Error: TypeError: Cannot read property 'length' of undefined
没有堆栈跟踪.这使得查找这些错误非常耗时,以至于我正在寻找jasmine-node的替代方案.
如何让jasmine-node输出错误的完整堆栈跟踪?--verbose命令行标志不会这样做.
我们有一个现有的SQL数据库,我正在编写一个使用直接SQL访问它的node.js服务器,使用这个postgres驱动程序模块:
https://github.com/brianc/node-postgres
到目前为止,我找不到与postgres一起使用的事务管理节点模块.有谁知道吗?最好有一些现实世界的使用?
其次,在更高层次上,我们正在评估node.js是否可以实际取代Java作为可能处理卷的服务器的真实解决方案.交易管理是我们必须解决的问题之一.因此,对此的一些见解也将是有用的.
目前,我只是在节点服务器请求开始时发出一个sql BEGIN,在结尾处发出一个ROLLBACK或COMMIT.但是,我(可能显然)不熟悉围绕SQL事务管理的现实问题.如果有人可以简要解释交易管理框架解决的问题,我会发现它很有用.
编辑:我正在使用postgres驱动程序的内置连接池机制,http请求中的所有查询都是在从池中获取的同一连接上发出的.首先发出BEGIN,然后是特定的http请求,然后是COMMIT或ROLLBACK.
谢谢.
我在我的快递应用程序中提供了一个路由,它提供了云文件的内容作为下载.我可以访问云文件的输入流,我想将其直接传递到响应的输出流中.但是,我正在使用express,它似乎不支持输入流.
我希望我能做到这一点:
res.send (cloudInputStream);
Run Code Online (Sandbox Code Playgroud)
但这不起作用.Express'发送一个正文或一个缓冲区,但显然不是输入流.
既然如此,我想要做的是使用res.setHeader()设置标头,然后访问原始输出流,然后:
cloudInputStream.pipe (responseOutputStream);
这可能吗?
或者,我可以将输入流读入缓冲区,并提供要发送的缓冲区.但是,这会将整个云文件的内容一次性读入内存,我想避免这种情况.
有什么想法吗?
node.js ×10
express ×4
postgresql ×3
pug ×2
sql ×2
.net ×1
asynchronous ×1
block ×1
certificate ×1
database ×1
dune ×1
events ×1
http ×1
https ×1
jasmine ×1
json.net ×1
middleware ×1
nuget ×1
ocaml ×1
opam ×1
request ×1
response ×1
sequence ×1
ssl ×1
stack-trace ×1
stream ×1
transactions ×1