我想知道是否可以使用保存在json文件中的信息在Keystone.js中为集合添加字段。 我会告诉你我的问题:
而不是
Collection.add({
aaa: {
type: String,
required: false
},
bbb: {
type: String,
required: false
},
ccc: {
type: String,
required: false
}
}); // this works!
我想以这种方式添加字段:
json_model = require(process.env.PWD + process.env.JSON_MODELS +'/collection.json'), //path of json file
var tmp_json = modelFromJsonFunc.json4model(json_model);
Projects.add(tmp_json);
输出
{
aaa: {
type: String,
required: false
},
bbb: {
type: String,
required: false
},
ccc: {
type: String,
required: false
}
}
...
使用mongo shell我看到这个集合没有字段! 为什么不起作用? 谢谢你的帮助。
答案 0 :(得分:0)
@Michele如果在您的示例中运行代码,因为您声称自己不会获得没有字段的集合,那么您将收到错误。
在以下代码行中:
json_model = require(process.env.PWD + process.env.JSON_MODELS +'/collection.json'), //path of json file
require()
使用JSON.parse()
来评估.json
个文件。您在上面显示的内容无效JSON
,会导致错误。
由于架构包含数据类型(其中一些特定于Keystone),因此需要将文件评估为JavaScript
而不是JSON
。实现所需要的一种可能方法是读取.json
文件,将其包装在IIFE中,该IIFE返回从.json
文件读取的数据,使用eval()
解析它,并返回结果
以下是我将如何做的一个例子......
requireJsonSchema.js
var keystone = require('keystone'),
Types = keystone.Field.Types,
fs = require('fs'),
path = require('path');
module.exports = function (pathname) {
try {
var data = fs.readFileSync(pathname);
return eval('(function() { return ' + data + '; })();');
} catch(e) {
return {};
}
}
Test.js
var keystone = require('keystone'),
Types = keystone.Field.Types,
requireJsonSchema = require('/path/to/requireJsonSchema'),
var Test = new keystone.List('Test');
var jsonSchema = requireJsonSchema('/path/to/Test.json');
Test.add(jsonSchema);
Test.register();