Node-RED中forEach循环构建HTTP批量请求的分号语法问题
问题
我正尝试在Node-RED中创建一个forEach循环来构建HTTP批量请求,要求负载格式为JSON对象,但我的函数节点持续提示在forEach循环末尾需要使用分号而非冒号。我知道这大概率是个低级错误,但始终找不到问题所在。
var ipaddr = msg.payload.ipddr[0] var credentials = msg.payload.auth[0] var base64 = new Buffer(credentials).toString('base64') const nameArray = msg.payload.nameArray const descriptionArray = msg.payload.descriptionArray const areaArray = msg.payload.areaArray const useTypeArray = msg.payload.useTypeArray const addressArray = msg.payload.addressArray const yearBuiltArray = msg.payload.yearBuiltArray var createMsg = {}; createMsg.method = "POST"; createMsg.headers = {}; createMsg.headers['authorization'] = 'basic ' + base64; createMsg.headers['Content-Type'] = "application/JSON"; createMsg.url = "https://" + ipaddr + "/v2/batch"; var body = { "requests":[ nameArray.forEach((y, i) => { { "id": nameArray[i] "url": "/api/rest/v2/services/site/buildings/" + nameArray[i] "key": name "use-type": useTypeArray[i] "area": areaArray[i] "address": addressArray[i] "description": descriptionArray[i] "year-built": yearBuiltArray[i] }, } ) ] }; createMsg.payload = body; node.send(createMsg); return null;
我原本预期像"area": areaArray[i]这样的写法是可行的。
解决方法
你的代码存在几个语法和逻辑错误,逐一修正如下:
- forEach无法直接生成数组元素:forEach仅用于遍历数组执行回调操作,返回值是
undefined,不能直接用来填充requests数组。改用map方法,它会遍历数组并返回新数组,正好用来构建批量请求的每一项。 - 对象属性间缺少逗号:每个请求对象里的键值对结尾未添加逗号,比如
"id": nameArray[i]后必须加逗号,否则会触发语法错误。 - 未定义变量
name:代码中"key": name的name变量未定义,应替换为nameArray[i](或直接使用map回调的name参数)。 - Buffer构造函数已废弃:Node.js中
new Buffer()已被废弃,换成Buffer.from()可避免运行时警告。
修正后的代码:
var ipaddr = msg.payload.ipddr[0]; var credentials = msg.payload.auth[0]; var base64 = Buffer.from(credentials).toString('base64'); const nameArray = msg.payload.nameArray; const descriptionArray = msg.payload.descriptionArray; const areaArray = msg.payload.areaArray; const useTypeArray = msg.payload.useTypeArray; const addressArray = msg.payload.addressArray; const yearBuiltArray = msg.payload.yearBuiltArray; var createMsg = {}; createMsg.method = "POST"; createMsg.headers = {}; createMsg.headers['authorization'] = 'basic ' + base64; createMsg.headers['Content-Type'] = "application/json"; createMsg.url = "https://" + ipaddr + "/v2/batch"; var body = { "requests": nameArray.map((name, i) => ({ "id": name, "url": "/api/rest/v2/services/site/buildings/" + name, "key": name, "use-type": useTypeArray[i], "area": areaArray[i], "address": addressArray[i], "description": descriptionArray[i], "year-built": yearBuiltArray[i] })) }; createMsg.payload = body; node.send(createMsg); return null;
内容的提问来源于stack exchange,提问作者CarnegieBaron
相关产品推荐
相关产品推荐

