【问题标题】:Can no longer call methods on Javascript object after res.send with Node.js在使用 Node.js 进行 res.send 之后,不能再调用 Javascript 对象上的方法
【发布时间】:2015-07-29 00:56:35
【问题描述】:

上下文和设计概述

我正在使用一个名为 Tiff.js 的库在网页上加载 Tiff 图像。我在服务器和客户端上使用库。在我的服务器中,我使用该库从服务器上的 Tiff 文件创建 Tiff 对象。然后我使用 ExpressJS 将 Tiff 对象发送给客户端。

问题

总结:使用res.send(object) 向客户端发送对象后,无法再对对象使用方法
更多信息: 从服务器(在 Node.js 中),当我在 Tiff 对象上调用 Tiff.js 库中的方法时,它工作正常。在这里你可以看到我已经调用了一些方法来获取文件信息并将它们记录到控制台。 在客户端,我使用 AngularJS 来获取 Tiff 对象。这似乎是成功的,因为我可以控制台记录该对象。但是当我在对象上调用 Tiff.js 库方法时,它会引发错误。在这里您可以看到我记录了 Tiff 对象,然后尝试记录 Tiff 对象的宽度。 注意:我已检查以确保客户端正确加载了 Tiff.js 文件。

代码

服务器控制器

'use strict';

var fs = require('fs');
var path = require('path');
var Tiff = require('./tiff');
var filename = 'test.oct';
var tiff;

exports.loadOCTFile = function(req, res) {
    Tiff.initialize({
        TOTAL_MEMORY: 300000000
    });


    fs.readFile(path.resolve(__dirname, filename), function(err, data) {
        if (err) {
            throw err;
        }
        tiff = new Tiff({
            buffer: data
        });

        console.log('width:', tiff.width());
        console.log('height:', tiff.height());
        console.log('currentDirectory:', tiff.currentDirectory());
        console.log('countDirectory:', tiff.countDirectory());
        tiff.setDirectory(0);
        res.send(tiff);
        tiff.close();
    });
};

Angular 控制器内部的相关客户端 JS

$scope.getTest = function() {
    $http.get('/oct_analysis_open').success(
        function(tiff) {
            console.log(tiff);
            console.log('width:', tiff.width());
        });
};

如果需要,我可以发布 Express 路由。

【问题讨论】:

  • 如果width 不是函数,它在客户端上是什么?
  • 如果对象来自ajax,就永远不会有任何方法...

标签: javascript angularjs node.js express


【解决方案1】:

问题是您将对象作为响应的负载接收。然后这个有效载荷被反序列化为一个对象,但它只是一个 plain 对象。如果你想调用它的方法,你需要用 Tiff 库再次包装收到的tiff 普通对象。

您在客户端和服务器上都使用 JS 的事实意味着您可以共享一些代码,但这并不意味着对象是共享的:您仍然使用客户端/服务器模型并且对象被传递在被序列化/反序列化为包含数据且仅包含数据的东西(可能是 JSON)之后,从一侧到另一侧。函数没有序列化。

编辑:您可能想尝试将数据发送到客户端,并在客户端使用您收到的数据重新创建一个 Tiff 对象,就像您在服务器上那样做。

【讨论】:

  • 我明白了。由于浏览器在我尝试时最终崩溃,因此该过程似乎过于密集而无法进行客户端。这就是为什么我想在服务器上做这件事。还有其他解决方法吗?我想在 html 上显示这些图像。
  • 这真的取决于你想要达到的目标。您可能想尝试将图像保存在客户端可访问的位置并为其提供图像的 url,或者您可以将图像保存在外部无法访问的位置并添加带有返回图像字节流的操作的路由请求。我能问一下为什么是 TIFF 吗?
  • 嘿抱歉,我知道这是迟到的回应。不幸的是,我不相信使用 Tiff.js 库保存图像是可能的。我使用 TIFF,因为它是一种流行的医学图像格式。问题:使用 Socket.io 之类的东西将对象发送到客户端怎么样?
  • 无论您如何将对象发送到客户端,您最终只会得到数据。我强烈建议不要尝试将对象的方法序列化到另一端的eval,因为这会构成严重的安全威胁(如果您正在处理医疗数据,则更是如此)。如何将 TIFF 数据转换为 PNG 并将其以 base64 编码格式发送给客户端?您是否需要在客户端上提供高分辨率图像以用于类似 PACS 的用途?
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2021-11-26
  • 2017-09-03
相关资源
最近更新 更多