0

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 を使用すると、このコレクションにはフィールドがありません! なぜ機能しないのですか?助けてくれてありがとう。

4

1 に答える 1

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。目的を達成する 1 つの可能な方法は、ファイルを読み取り、.jsonファイルから読み取ったデータを返す 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();
于 2015-02-08T01:26:12.673 に答える