【问题标题】:Why can't I add a simple reusable function to Postman?为什么我不能给 Postman 添加一个简单的可重用函数?
【发布时间】:2019-08-17 05:57:25
【问题描述】:

在 Postman 中,我试图实现以下目标:

  1. 在集合中:
    1. 创建一个包含可重用函数的实用程序对象
    2. 将该实用程序对象存储在全局变量中,以供以后在请求测试脚本中使用。
  2. 在请求中:
    1. 从全局变量中提取实用程序对象代码。
    2. 评估代码并将生成的实用程序对象实例存储在局部变量中。
    3. 在实用程序对象实例上调用方法。

不过,我在网络上看到的许多实现似乎都不起作用。我可以一直降到第 2.2 步,然后事情就会死于可怕的火焰般的死亡。 Postman 下的 JavaScript 引擎拒绝评估存储在 globals 集合中的对象。

为了隔离问题,我已将其简化为最低限度的脚本,该脚本放置在我的收藏的预请求脚本中:

postman.setGlobalVariable("loadUtils", function utils() {
    let utils = {};
    utils.main = function() {
        console.log("Hello, world!");
    }
    return utils;
} + ';utils()');

然后我尝试按如下方式加载此脚本:

var code = globals.loadUtils;
console.log(code);
var utils = eval('(' + code + ')');

但总是出现以下错误:

评估测试脚本时出错:SyntaxError: 意外的令牌;

我试过了:

  • 将整个函数转换为多行字符串并将结果存储在全局环境中。发生了同样的错误。
  • 在函数体中直接包含括号。那也没用。
  • 使用 lambda 表达式,但这会导致编辑器本身出现各种问题。

我确信这是简单、愚蠢和显而易见的事情,而我只是没有看到它。

有人可以指出我在这里做错了什么吗?

附:正如here on StackOverflowPostman forums on GitHub 所建议的那样,这应该是可能的(尽管它需要滚动浏览cmets 才能看到解决方案)。

【问题讨论】:

  • 如果将;utils() 更改为() 会发生什么?
  • @JonasWilms 相同的响应。我将身体内脏,使其包含let utils = {}; return utils;,但仍然出现Unexpected token ; 错误。

标签: javascript postman


【解决方案1】:

您将两个语句存储为一个字符串,它们之间用分号分隔:

 "function utils() { /*...*/ }; utils()"

然后你将该字符串包装在括号中并尝试执行它:

eval("(function { /*...*/ }; utils())")

这不起作用,因为表达式中的; 是语法错误。

您要么删除括号,用冒号替换分号,要么使用 IIFE(我喜欢这里):

eval("(" + someFunc + ")()");

【讨论】:

  • 这真的很奇怪。这是this question 最受好评的回答中使用的技术,这几乎是我遇到的问题。
  • @mike 不,不是。 eval(globals.loadUtils)
  • 我指的是两个分号——它在顶部代码块中,他有} + '; loadUtils();');。但它既不在这里也不在那里。最后,您认为我需要添加一组额外的括号吗?
猜你喜欢
  • 1970-01-01
  • 2011-07-23
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 2015-01-03
  • 2020-12-28
  • 1970-01-01
相关资源
最近更新 更多