NodeJS调用Dynamics CRM出现请求路径未转义字符TypeError求助
解决Node.js调用Dynamics CRM时的
TypeError: Request path contains unescaped characters错误 嘿,这个问题我之前帮同事排查过,咱们直接说问题根源和解决办法:
问题原因
你代码里的path参数用了&来分隔查询参数,但这是HTML转义后的字符,而Node.js的https.request需要的是标准URL格式——用原始的&来分隔参数,&会被识别成未转义的非法字符,所以抛出了这个错误。
另外,手动拼接URL路径很容易出现这类转义疏漏,比如如果后续参数里有空格、特殊符号,也会触发同样的问题。
两种解决方法
方法1:直接修正路径中的转义字符
把path里所有的&替换成&即可,修正后的代码如下:
var options = { path: '/api/data/v8.2/contacts?$select=address1_city,address1_line1,address1_line2,address1_line3,contactid,emailaddress1,firstname,fullname,middlename,mobilephone,statecode,suffix,telephone1,vcm_npiid,vcm_prescriberspeciality,vcm_prescriberstatus,vcm_recordtype,vcm_symphonyid&$orderby=fullname asc&$filter=statecode eq 0', host: 'xxxxxx.crm.dynamics.com', method: 'GET', // 补充你的headers等其他必要配置,比如Authorization };
方法2:用Node.js内置url模块构建URL(更推荐)
手动拼接URL容易出错,用Node.js自带的url模块可以自动处理参数转义,避免这类问题。代码示例:
const url = require('url'); // 构建完整的请求URL const requestUrl = url.format({ protocol: 'https', host: 'xxxxxx.crm.dynamics.com', pathname: '/api/data/v8.2/contacts', query: { $select: 'address1_city,address1_line1,address1_line2,address1_line3,contactid,emailaddress1,firstname,fullname,middlename,mobilephone,statecode,suffix,telephone1,vcm_npiid,vcm_prescriberspeciality,vcm_prescriberstatus,vcm_recordtype,vcm_symphonyid', $orderby: 'fullname asc', $filter: 'statecode eq 0' } }); // 解析成https.request需要的options对象 const options = url.parse(requestUrl); options.method = 'GET'; // 添加你的请求头,比如Authorization: 'Bearer <your-access-token>'
额外提醒
如果你的查询参数里包含空格、中文或者其他特殊字符(比如$filter里如果有字符串值),url.format会自动帮你做URL编码,比手动处理靠谱多了。
内容的提问来源于stack exchange,提问作者souravlahoti
相关产品推荐
相关产品推荐

