使用json-server启动mock服务遇“Cannot create property 'id' on string”错误求助
json-server启动失败:无法在字符串上创建'id'属性(字符串数组兼容方案)
问题场景
使用json-server搭建mock服务,db.json内容如下:
{ "a": ["b"] }
执行安装命令:
$ npm install -g json-server
启动命令:
$ json-server db.json --port 5500
启动时抛出如下错误:
file:///root/.nvm/versions/node/v16.20.2/lib/node_modules/json-server/lib/service.js:87 item['id'] = randomId(); ^ TypeError: Cannot create property 'id' on string 'b' at file:///root/.nvm/versions/node/v16.20.2/lib/node_modules/json-server/lib/service.js:87:24 at Array.forEach (<anonymous>) at fixItemsIds (file:///root/.nvm/versions/node/v16.20.2/lib/node_modules/json-server/lib/service.js:82:11) at file:///root/.nvm/versions/node/v16.20.2/lib/node_modules/json-server/lib/service.js:95:13 at Array.forEach (<anonymous>) at fixAllItemsIds (file:///root/.nvm/versions/node/v16.20.2/lib/node_modules/json-server/lib/service.js:93:25) at new Service (file:///root/.nvm/versions/node/v16.20.2/lib/node_modules/json-server/lib/service.js:102:9) at createApp (file:///root/.nvm/versions/node/v16.20.2/lib/node_modules/json-server/lib/app.js:17:21) at file:///root/.nvm/versions/node/v16.20.2/lib/node_modules/json-server/lib/bin.js:116:13
仅将db.json改为{"a": "b"}时服务可正常启动,需要让json-server兼容字符串数组格式。
原因分析
json-server默认会为根级数组(作为mock资源的数组)中的每一项自动添加id属性,用于模拟RESTful接口的资源唯一标识。但字符串属于原始值类型,无法动态添加属性,因此触发类型错误。
解决方案
方案1:关闭自动生成id(快速兼容纯字符串数组)
启动服务时添加--no-id参数,禁用json-server自动为数组项添加id的行为:
$ json-server db.json --port 5500 --no-id
启动后请求/a接口,会直接返回原始的字符串数组["b"],满足基础的mock数据获取需求。
方案2:将字符串包装为对象(支持完整REST操作)
如果后续需要对数组项进行增、删、改、查等RESTful操作,建议把字符串包装成对象结构,修改db.json为:
{ "a": [{"value": "b"}] }
此时json-server会自动为每个对象生成id属性,启动后请求/a会返回:
[{"value": "b", "id": 1}]
这种方式可以充分利用json-server的RESTful功能,支持通过/a/1获取单条数据、POST请求新增数据等操作。
内容的提问来源于stack exchange,提问作者Evan D Losh
相关产品推荐
相关产品推荐

