2016-05-03 3 views
0

急行アプリ、私はこのコードで私のルータにJSONファイルの内容を読み出す:私の非同期fs.ReadFile関数はどのようにシンクロナスになりますか?私のNode.jsで

lib/functions.js

このようなルータで呼び出され
'use strict'; 

const fs = require('fs'); 

exports.fsAsync = (callback) => { 
    fs.readFile(__dirname + '/../database/data.json', 'utf8', (err, data) => { 
    if(err) { 
     throw callback(err) 
    }; 
    callback(null, JSON.parse(data)); // null means no error, return results in callback 
    }); 
}; 

routes/contact.js

'use strict'; 

const express = require('express'), 
     router = express.Router(); 

const functions = require('../lib/functions'), 
     fsAsync = functions.fsAsync; 

router.get('/', (req, res, next) => { 
    fsAsync((err, data) => { 
    if (err) { 
     return res.render('404', { 
     title: 'Error 404' 
     }); 
    } 

    const contact = data[2].contact; 

    res.render('contact', { 
     title: 'Contact', 
     data: contact 
    }); 
    }); 
}); 

module.exports = router; 

ただし、コンソールで同期エラーが発生しました:

(node:12808) WARNING: Detected use of sync API 
    at fs.statSync (fs.js:981:18) 
    at tryStat (C:\www\node\site\node_modules\express\lib\view.js:169:15) 
    at resolve (C:\www\node\site\node_modules\express\lib\view.js:142:14) 
    at lookup (C:\www\node\site\node_modules\express\lib\view.js:110:17) 
    at View (C:\www\node\site\node_modules\express\lib\view.js:85:20) 
    at render (C:\www\node\site\node_modules\express\lib\application.js:569:12) 
    at render (C:\www\node\site\node_modules\express\lib\response.js:961:7) 
    at fsAsync (C:\www\node\site\routes\contact.js:23:9) 
    at fs.readFile (C:\www\node\site\lib\functions.js:18:5) 
GET /en/contact 304 154.638 ms - - 

誰かがこの関数を真に非同期で書くのに役立ちますか?

+2

https://github.com/expressjs/express/issues/2960 – georg

+0

Upps、これも私の質問でした...あなたの誤りではありません。私のfsAsync機能がないとそこに表示されるエラーは、 'res.render'は非同期モジュールではありません(現時点では)。 – Lanti

+0

これはおそらくこのエラーの原因にもなります。ちょうど "fsAsync"の部分が私を騙しました。 – Lanti

答えて

0

なぜ直接fs.readFileSync()を使用していませんか?たとえば

var content = fs.readFileSync("file.json", "utf8"); 
+0

私はこのファイルを5-6ルーターで読んでいます。もし私がそれを変更すると、私はそれを一度コードしようとしました。 – Lanti

0

あなたが.jsonファイルを使用しているので、あなたはまた、JSONの構文解析の仕事をしていません

requireを使用することができます。

var myDataObj = require('path_to/data.json');

また、あなたはあなたのファイルの先頭に、これが必要と入れて、あなたはそれぞれの要求にdata.jsonファイルを読んでいないだろうし、それがキャッシュとして動作するように、あなたのルートでmyDataObjを使用することができます。

関連する問題