前情提要

某些NetSuite向外部系统推送数据的场景可能需要用到MapReduce的场景,此种情况如果涉及token是比较多变的。如果放在getInputData阶段取得token然后用参数带给map阶段使用,则可能随时遇到token过时的情况,可能还需要重新获得token;如果是每一步都重新获得token则可能消耗目标系统太多资源。中国很多集成实际上是采用了IP黑白名单制度,然而这种方式并不适合NetSuite这样的云平台。因此使用OAuth2.0这样token机制是必要的而用N/cache更使这样的情况变得便捷。

代码设计

使用N/cache构建如下的代码,可以实现向目标主机获取cookie然后使用cookie内容发送请求的目的。

var cacheObject = cache.getCache({
	name: 'myCookie',//随便创建一个名称
	scope: cache.Scope.PRIVATE//设置作用域为private或者public,protected,具体可以看文档
});
var cachedCookieAsStr = cacheObject.get({
	key: 'cookie_string',//cache作为object的key
	loader: getCookieToCache, //用于获取token的方法,我
	ttl:3600
});

其中getCookieToCache的方法如下。注意Cache.get()的loader返回值如果是json则系统会帮你stringify。

function getCookieToCache(context) {
        let kSessionId = ''
        try {
            var url = 'https://api.netsuiteful.com/validate';
            var response = http.post({
                url: url,
                headers: {
                    "Connection": "keep-alive",
                    'Content-Type': 'application/json',
                    "Accept": "application/json"
                },
                body: JSON.stringify({
                    userName: 'netsuiteful',
                    password: 'aSTRONGp@ssw0rd'
                })
            });
            kSessionId = JSON.parse(response.body).Context.SessionId
        }
        catch(ex) {
             //other response status
        }
        var wrapper = {
            'cookie_string': kSessionId
        };
        return wrapper
    }

之后使用时,直接调取cacheObj.get()就好,如果cache因为过期、系统自动抛弃等原因不存在,系统会自动按照loader去获取。

var tokenFromCache = JSON.parse(cachedCookieAsStr)['cookie_string'];
if (!tokenFromCache) throw error.create({
	name: 'CACHED_TOKEN_ERR',
	message: kSessionId
});
var responseObj = https.post({
        url: 'https://api.netsuiteful.com/api/v1/user'
})

延伸阅读

  1. N/cache还有put,get等等方法,不过都不如Cache.get()这样有loader的方法如此实用
  2. ttl默认是无限长,也可以考虑设置一个自动过期的时间,如果token会过期则cache存储的token也应该考虑过期
  3. cache还可以跨脚本使用,可以找找各个scope有什么区别
Last modified: 08/01/2025

Author

Comments

Write a Reply or Comment

Your email address will not be published.