【问题标题】:How my asynchronous fs.ReadFile function become synchronus?我的异步 fs.ReadFile 函数如何变得同步?
【发布时间】:2016-05-03 12:56:43
【问题描述】:

在我的 node.js express 应用程序中,我使用以下代码将 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 - -

有人可以帮助编写这个真正异步的函数吗?

【问题讨论】:

  • Upps,这也是我不久前的问题... :) 没有我的 fsAsync 函数出现的错误显示在控制台中的res.render,这不是异步模块(现在) .
  • 所以可能这也是导致此错误的原因,只是“fsAsync”部分欺骗了我。
  • 哈哈看到同一个头像))) 反正是快递问题,和你的代码无关。您的 func 在堆栈上,因为您正在从中调用 render

标签: javascript node.js express asynchronous


【解决方案1】:

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

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

【讨论】:

  • 我在 5-6 个路由器中读取此文件。如果我对其进行更改,我会尝试对其进行编码。
【解决方案2】:

由于您使用的是.json 文件,因此您可以使用

require 也负责解析 JSON。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多