NodeJS动态创建对象时遇意外模板字符串错误的解决办法
Node.js 动态引入控制器的模板字符串变量声明错误修复
问题场景
我尝试在 Node.js 中动态引入 Controllers,实体对象定义如下:
ENTITY : { USER : 'user', COUNTRY : 'country' }
基于该对象编写的代码如下:
for (var key in ENTITY) { if (ENTITY.hasOwnProperty(key)) { const controllerName = MiscHelp.camelCase(ENTITY[key], true) + 'Controller'; console.log(controllerName); const controllerFile = '../app/Http/Controllers/' + version + '/' + controllerName; console.log(controllerFile); const `${controllerName}` = require(controllerFile)(version); } }
控制台输出正常:
UserController ../app/Http/Controllers/v1/UserController CountryController ../app/Http/Controllers/v1/CountryController
但代码中const ${controllerName} = require(controllerFile)(version);这一行触发了**"Unexpected Template String"**错误,需要解决这个问题。
错误原因
JavaScript 不允许用模板字符串直接作为const/let/var的变量名,变量声明时必须使用合法的标识符,无法直接通过动态字符串声明变量。
解决方法
方法1:用对象存储动态控制器(推荐)
创建一个空对象,将每个动态引入的控制器作为对象属性存入,属性名使用controllerName的值:
// 初始化空对象用于存储所有控制器 const controllers = {}; for (var key in ENTITY) { if (ENTITY.hasOwnProperty(key)) { const controllerName = MiscHelp.camelCase(ENTITY[key], true) + 'Controller'; console.log(controllerName); const controllerFile = '../app/Http/Controllers/' + version + '/' + controllerName; console.log(controllerFile); // 通过对象属性动态赋值 controllers[controllerName] = require(controllerFile)(version); } }
后续可通过controllers.UserController或controllers['UserController']访问对应的控制器。
方法2:挂载到全局作用域(不推荐)
如果需要让控制器成为全局变量,可使用global对象赋值,但这种方式会污染全局作用域,仅在特殊场景下使用:
for (var key in ENTITY) { if (ENTITY.hasOwnProperty(key)) { const controllerName = MiscHelp.camelCase(ENTITY[key], true) + 'Controller'; console.log(controllerName); const controllerFile = '../app/Http/Controllers/' + version + '/' + controllerName; console.log(controllerFile); // 挂载到全局 global[controllerName] = require(controllerFile)(version); } }
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

