我的异步fs.ReadFile函数如何成为同步?

时间:2016-05-03 12:56:44

标签: javascript node.js express asynchronous

在我的node.js express app中,我使用以下代码将json文件的内容读取到我的路由器:

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 个答案:

答案 0 :(得分:0)

为什么不直接使用fs.readFileSync()
例如:

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

答案 1 :(得分:0)

因为您使用的是.json文件,所以可以使用

require也可以解析JSON。

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

此外,您可以将此要求放在文件的顶部,并在路由中使用myDataObj,这样您就不会在每个请求中读取data.json文件,它将充当缓存。< / p>