小编Jac*_*son的帖子

Node.js - 在管道响应之前检查流是否有错误

在Node.js中,假设我想从某个地方读取文件并流式传输响应(例如,使用文件系统fs.createReadStream()).

application.get('/files/:id', function (request, response) {
    var readStream = fs.createReadStream('/saved-files/' + request.params.id);
    var mimeType = getMimeTypeSomehow(request.params.id);
    if (mimeType === 'application/pdf') {
        response.set('Content-Range', ...);
        response.status(206);
    } else {
        response.status(200);
    }
    readStream.pipe(response);
});
Run Code Online (Sandbox Code Playgroud)

但是,我想在发送响应头之前检测流是否有错误.我怎么做?

伪代码:

application.get('/files/:id', function (request, response) {
    var readStream = fs.createReadStream('/saved-files/' + request.params.id);
    readStream.on('ready', function () {
        var mimeType = getMimeTypeSomehow(request.params.id);
        if (mimeType === 'application/pdf') {
            response.set('Content-Range', ...);
            response.status(206);
        } else {
            response.status(200);
        }
        readStream.pipe(response);
    });
    readStream.on('error', function () {
        response.status(404).end();
    });
});
Run Code Online (Sandbox Code Playgroud)

javascript stream node.js

4
推荐指数
1
解决办法
5279
查看次数

是否有必要在HTTP/2中缓存半身像?

在HTTP/1中,为了避免额外的网络请求来确定资源是否应该保持缓存,我们将在静态资产上设置一个高值max-ageExpires值,并为每个版本提供一个唯一的URL.但是在HTTP/2中,请求很便宜,所以我们可以在没有缓存破坏的情况下完成,只需依赖ETag,最后修改,等等?

我可以看到继续破坏缓存(除了双重服务HTTP/1和HTTP/2客户端)的唯一优势是在资源过期时节省带宽检查.甚至那可能与HPACK无关.我错过了什么,或者我现在可以阻止缓存破坏吗?

caching http2

4
推荐指数
1
解决办法
743
查看次数

nginx 为哪些内容类型启用压缩

在几个解释“如何设置 gzip 压缩”的 nginx 教程网站中,我看到重复的 MIME 类型列表:

gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

然而,我立即发现这个列表并没有导致在 Chromium 中为 JavaScript 启用压缩。我必须添加application/javascript到列表中。这让我相信这个列表已经过时了。

是否有我想要进行 gzip 压缩的所有内容类型的明确列表?

compression gzip content-type nginx mime-types

4
推荐指数
1
解决办法
1402
查看次数

虚拟主机强制 https 并将 www 重定向到非 www,但没有其他子域

这本质上与htaccess force https 并将 www 重定向到非 www,但没有其他子域(即,我想配置 Apache 以将所有非 HTTPS和/或“www” URL重定向到 HTTPS 非 www URL 的问题相同) ,但我想通过虚拟主机而不是.htaccess文件来配置 Apache (因为我读到了避免.htaccess有一些好处)。

使用.htaccess文件时,我能够得到以下答案:https : //stackoverflow.com/a/34333450/1468130但是当我尝试将该答案的配置传输到我的虚拟主机配置时它不起作用;“ https://www.domain.com ” 从未重定向到“ https://domain.com ” ”。

我阅读了.htaccess虚拟主机.conf文件和虚拟主机文件之间的差异,并找到了这个http://tltech.com/info/rewriterule-in-htaccess-vs-httpd-conf/和这个:https : //www.digitalocean.com/ community/questions/can-you-use-virtual-host-config-conf-to-redirect-www-domain-to-non-www?answer=15129这似乎暗示我可以将配置包装在一个<Directory>块中它会工作。不幸的是,它没有(“ https://www.domain.com ”仍然从未重定向到“ https://domain.com ”),所以我想知道互联网是否知道我做错了什么:

<VirtualHost *:80>
        ServerName domain.com
        ServerAlias www.domain.com

        ServerAdmin admin@domain.com
        DocumentRoot /var/www/domain.com/

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /var/www/domain.com/>
                RewriteEngine On

                # match any …
Run Code Online (Sandbox Code Playgroud)

apache .htaccess mod-rewrite redirect

4
推荐指数
1
解决办法
8277
查看次数

JavaScript Bang"!" 功能与领先的半结肠";" IIFEs

Airbnd建议我这样做:

!function() {
  // ...
}();
Run Code Online (Sandbox Code Playgroud)

因为:

这可确保如果格式错误的模块忘记包含最终分号,则在脚本连接时,生产中不会出现错误.

爆炸让我可以解决语言的语法规则:

// Evaluated in Chromium 34 console.
function(){}(); // => SyntaxError: Unexpected token (
!function(){}(); // => true
Run Code Online (Sandbox Code Playgroud)

当连接其他模块时,爆炸似乎可以解决问题:

!function(){}();function(){}(); // => SyntaxError: Unexpected token (
!function(){}();!function(){}(); // => true
(function(){}());!function(){}(); // => true
Run Code Online (Sandbox Code Playgroud)

然而,它似乎并不"安全",因为如果其他人的脚本末尾没有分号:

!function(){}()!function(){}(); // => SyntaxError: Unexpected token !
(function(){}())!function(){}(); // => SyntaxError: Unexpected token !
Run Code Online (Sandbox Code Playgroud)

看起来领先的分号IIFE更好.

;(function() {
  // ...
}());

!function(){}();(function(){}()); // => undefined
(function(){}());(function(){}()); // => undefined
!function(){}();;(function(){}()); // => undefined
(function(){}());;(function(){}()); // => undefined …
Run Code Online (Sandbox Code Playgroud)

javascript function concatenation iife

3
推荐指数
1
解决办法
1278
查看次数

elisp - 获取相对于脚本的文件路径

假设我正在编写一个 emacs lisp 函数,该函数与一个文件接口,该文件相对于定义该函数的文件。

- bin/executable
- foo.el
Run Code Online (Sandbox Code Playgroud)

foo.el

(defun foo ()
  (shell-command-to-string
   (format "echo '%s' | ./bin/executable"
           (buffer-substring-no-properties
            (point-min)
            (point-max)))))
Run Code Online (Sandbox Code Playgroud)

如果我foo.el从那时开始运行它,它会很好用。如果我在编辑任何其他文件时调用该函数,它将不起作用,因为路径不正确。

无论在哪里调用函数,如何./bin/executable从内部可靠地引用foo.el

emacs elisp relative-path

3
推荐指数
1
解决办法
1848
查看次数

在`irb`中,反引号抛出异常,但在`rails c`中,它们没有

  • 操作系统:Debian GNU/Linux 8
  • Ruby版本:2.4.1
  • Rails版本:5.1.4

我刚刚rails new创建了一个全新的Rails项目.在其目录中,irb我试图为不存在的可执行文件执行shell命令,并抛出异常:

irb(main):001:0> `foobar`
Errno::ENOENT: No such file or directory - foobar
    from (irb):1:in ``'
    from (irb):1
    from /home/jackson/.rbenv/versions/2.4.1/bin/irb:11:in `<top (required)>'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:74:in `load'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:74:in `kernel_load'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:27:in `run'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/cli.rb:335:in `exec'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor.rb:359:in `dispatch'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/cli.rb:20:in `dispatch'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/base.rb:440:in `start'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/cli.rb:11:in `start'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/exe/bundle:32:in `block in <top (required)>'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/friendly_errors.rb:121:in `with_friendly_errors'
    from /home/jackson/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/exe/bundle:24:in `<top (required)>'
    from /home/jackson/.rbenv/versions/2.4.1/bin/bundle:22:in `load'
    from /home/jackson/.rbenv/versions/2.4.1/bin/bundle:22:in `<main>'
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试在我的Rails环境中执行相同的操作时 …

ruby shell ruby-on-rails backticks

3
推荐指数
1
解决办法
248
查看次数

Webpack 中的“导入全局变量”

我们有一个 webpack 应用程序,我们将它集成到一个使用传统 JS 脚本的站点中,这些脚本定义了全局变量。

在我们的 webpack 应用程序中,我们想要import一些恰好已经作为脚本出现在页面上的库。与其下载相同的代码两次,一次作为脚本,然后再次嵌入到 webpack 包中,我们希望 webpack 不将页面上已有的库代码作为脚本包含在内,但仍允许我们使用 ESimport语法“导入”我们模块中的代码,即使有问题的脚本代码实际上通过全局变量使库可用。

所以,我们<script src="jquery.js">在我们的页面上。 jquery.js据说做这样的事情:

window.jQuery = {};
Run Code Online (Sandbox Code Playgroud)

在我们由 Webpack 编译的代码中,我们想做:

import jQuery from 'jquery';
jQuery === window.jQuery // true
Run Code Online (Sandbox Code Playgroud)

有没有办法让 Webpack 被配置为解决某些依赖项,比如上面例子中的“jquery”,并确定它应该将import代码转换为对该全局变量的引用?

这里的目的是在我们的遗留应用程序的新代码中逐渐选择新的 ES 模块语法,同时仍然利用相同的代码已经作为脚本在页面上可用的事实。

我查看了Webpack 关于“填充”的指南,但它似乎提供了我在这篇文章中描述的功能之外的所有功能。

javascript global-variables ecmascript-6 webpack es6-modules

2
推荐指数
1
解决办法
4034
查看次数

在"同时"属性更改时渲染一次

在我的Backbone.js应用程序中,我有以下模型和视图:

var Operation = Backbone.Model.extend({

    defaults: function() {
        return {
            sign: '-',
            value: '0000',
            index: 0
        }
    }
});
var operation = new Operation();

var OperationView = Backbone.View.extend({

    el: '#operation',

    initialize: function() {
        this.listenTo(this.model, 'change:sign change:value', this.renderOperation);
        this.renderOperation();
    },

    renderOperation: function() {
        console.log('rendered once');
        this.$el.html(this.model.get('sign') + this.model.get('value'));
    }
});
var operationView = new OperationView({ model: operation });
Run Code Online (Sandbox Code Playgroud)

观看的地方

'change:sign change:value'
Run Code Online (Sandbox Code Playgroud)

(...每当"sign"或"value"发生变化时更新视图.)

我用的时候

// Test
setInterval(function() {
    var newValue = parseInt(operation.get('value'), 10);
    newValue += 500;
    newValue += '';
    operation.set({ 'sign': '+', …
Run Code Online (Sandbox Code Playgroud)

javascript backbone.js backbone-events backbone-views

1
推荐指数
1
解决办法
898
查看次数

Elisp - 删除长度为1的列表中的唯一项目

在Emacs Lisp中,我似乎无法从列表中删除最后一项.

;; This works.
(setq list1 '(alpha beta))
(delete 'alpha list1) ;; => (beta)
;; list1 => (beta)

;; NOPE.
(setq list1 '(alpha))
(delete 'alpha list1) ;; => nil
;; list1 => (alpha)
Run Code Online (Sandbox Code Playgroud)

为什么?

如果有可能的话,我该怎么做?

lisp emacs elisp

1
推荐指数
2
解决办法
246
查看次数

MySQL 在退出时说“再见”有什么原因吗?

每当我退出 MySQL 时,程序都会打印消息“再见”。

这样做有什么特别的原因吗?例如,以便脚本调用mysql可以猜测程序退出的时间点?或者这只是开发者的一点幽默?

我问这个问题是因为我有一个用例(我不能透露其细节,因为违反了合同)要求我消除这条消息,所以我想知道在尝试修改 MySQL 以删除它之前它是否有任何实际目的消息。

mysql

0
推荐指数
1
解决办法
1114
查看次数