开发者问题收集

尝试使用 https 模块访问端点时出现“Promise 未定义”

2019-02-22
1343

我试图确保 Netsuite 上 salesOrder 上的任何更改都会反映在 Cloud Firestore 数据库中的 salesOrder 集合副本中。

出于某种原因,我在尝试编辑和保存 salesOrder 时收到的响应是 org.mozilla.javascript.EcmaError: ReferenceError: “Promise” 未定义。(/SuiteScripts/postSalesOrder-v2.js#30)

这是链接到 salesOrder 的脚本:

/**
 * User Event 2.0 example detailing usage of the Submit events
 *
  @NApiVersion 2.x
  @NModuleScope SameAccount
  @NScriptType UserEventScript
  @appliedtorecord salesorder
 */

define(['N/https'], function(https) {
  function myAfterSubmit(context) {
    var apiURL = 'https://myApiEndpoint';
    var headers = {
      'content-type': 'application/json',
      accept: 'application/json'
    };

    https.post
      .promise({
        url: apiURL,
        headers: headers,
        body: JSON.stringify(context.newRecord)
      })
      .then(function(response) {
        log.debug({
          title: 'Response',
          details: response
        });
      })
      .catch(function onRejected(reason) {
        log.debug({
          title: 'Invalid Post Request: ',
          details: reason
        });
      });
    return true;
  }

  return {
    afterSubmit: myAfterSubmit
  };
});
2个回答

服务器端 http 调用是同步的,并返回响应而不是 Promise。

bknights
2019-02-22

目前,可以在服务器端 SuiteScript 中使用 http.[get|post|etc].promise

如果您调用其中的几个,是否真的会并行运行,或者脚本是否会在没有实现承诺的情况下退出,谁也说不准,但 API 在 SuiteScript 2.1 中确实有效。

/**
 * @NApiVersion 2.1
 * @NScriptType UserEventScript
 */
define(['N/https'], function (https) {
    function afterSubmit(context) {        
        https.post.promise({ 
            url: "https://stackoverflow.com",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
                message: "Hey planet"
            })
        });
    }

    return {
        afterSubmit: afterSubmit
    };
});

注释中的标签 ( @NApiVersion 2.1 ) 很重要,否则您正在使用不支持较新 Javascript 功能的 SuiteScript 2.0。

Ronnie Overby
2023-08-11