0

Express2.5.8とmongoose2.7.0を使用しています。これが私のドキュメントスキーマです。このコレクションは、トランザクションに関連付けられたファイル(具体的にはコンテンツ文字列)を保存する場所です。

var documentsSchema = new Schema({
    name            :    String,
    type            :    String,
    content         :    String,    
    uploadDate      :    {type: Date, default: Date.now}
});

そして、これが私のトランザクションスキーマの一部です。

var transactionSchema = new Schema({
    txId            :    ObjectId,
    txStatus        :    {type: String, index: true, default: "started"},
    documents       :    [{type: ObjectId, ref: 'Document'}]
});

そして、ドキュメントをトランザクションに保存するために使用しているエクスプレス関数は次のとおりです。

function uploadFile(req, res){
    var file = req.files.file;
    console.log(file.path);
    if(file.type != 'application/pdf'){
        res.render('./tx/application/uploadResult', {result: 'File must be pdf'});
    } else if(file.size > 1024 * 1024) {
        res.render('./tx/application/uploadResult', {result: 'File is too big'});
    } else{
        var document = new Document();
        document.name = file.name;
        document.type = file.type;
        document.content = fs.readFile(file.path, function(err, data){
            document.save(function(err, document){
                if(err) throw err;
                Transaction.findById(req.body.ltxId, function(err, tx){
                    tx.documents.push(document._id);
                    tx.save(function(err, tx){
                        res.render('./tx/application/uploadResult', {result: 'ok', fileId: document._id});
                    });
                });
            });
        });
    }
}

トランザクションは問題なく作成されます。そして、ドキュメントレコードが作成され、コンテンツ以外のすべてが設定されます。

コンテンツが設定されないのはなぜですか?fs.readFileは、問題なくファイルをバッファとして返します。

4

2 に答える 2

1

変化する:

    document.content = fs.readFile(file.path, function(err, data){

に:

    fs.readFile(file.path, function(err, data){
       document.content = data;

readFileは非同期であるため、コールバックが呼び出されるまでコンテンツは利用できないことに注意してください(ヒントは、dataパラメーターを使用していなかったことです)。

于 2012-07-10T00:50:52.290 に答える
0

@ebohlmanによって提案されたように非同期呼び出しを使用してパスをたどる代わりに、同期呼び出しを使用してファイルの内容を取得することもできます。

javascript document.content = fs.readFileSync(file.path)

于 2015-02-12T17:55:42.180 に答える